但是,除了 OpenIDConnect,我不需要任何其他授权方法。我需要将未经授权的用户立即重定向到远程授权服务器。
如何阻止其他登录方式,直接重定向到授权服务器,而不是 ASP.NET 登录页面?
确实,有一种方法可以直接重定向到授权服务器,而无需访问任何本地登录页面。
但通常我们仍然需要另一个SignInScheme。如果你查看源代码,你会发现当远程身份验证处理程序成功验证某个用户时,它会sign the user in:
// ...
await Context.SignInAsync(SignInScheme, ticketContext.Principal, ticketContext.Properties);
// ...
例如,如果OAuth2.0 认证成功,我们应该为当前用户设置一个cookie或颁发一个JWT令牌。
至于您的问题,最简单的方法是向 Challenge / Signin 注册一个 cookie 方案:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("MyOIDC", options =>
{
// ...
}
现在您可以随意使用[Authorize]。没有ASP.NET Core Identity
,上面的代码对我来说完美无缺
[更新]:抱歉,我忘了说我们必须自定义挑战流程:
- 方法一:为 Cookie 配置前向挑战方案:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>{
options.ForwardChallenge ="MyOIDC";
})
.AddOpenIdConnect("MyOIDC", options =>
{
// ....
}
- 方法 2:手动调用质询方案:
public class AccountController : Controller
{
public async Task Login(string returnUrl = "/")
{
await HttpContext.ChallengeAsync("MyOIDC", new AuthenticationProperties() { RedirectUri = returnUrl });
}
// if you need sign out the MyOIDC service, you could sign out the user for two schemes as below :
[Authorize]
public async Task Logout()
{
await HttpContext.SignOutAsync("MyOIDC", new AuthenticationProperties
{
RedirectUri = Url.Action("Index", "Home")
});
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}