然而,我只需要OpenIDConnect授权方法,不需要其他任何授权方式。我需要一个未经授权的用户立即重定向到远程授权服务器。
如何防止其他登录方式并直接重定向到授权服务器,而不是到ASP.NET登录页?
实际上,有一种方法可以直接重定向到授权服务器,而不需要访问任何本地登录页面。
但通常我们仍然需要另一个SignInScheme
。如果您查看源代码,您会发现当远程身份验证处理程序成功验证某个用户时,它将会登录该用户:
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。
[更新]:抱歉,我忘记提到我们必须自定义挑战流程:
- 方法1:为Cookie配置一个前向挑战方案:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>{
options.ForwardChallenge ="MyOIDC";
})
.AddOpenIdConnect("MyOIDC", options =>
{
}
方法二:手动调用挑战方案:
public class AccountController : Controller
{
public async Task Login(string returnUrl = "/")
{
await HttpContext.ChallengeAsync("MyOIDC", new AuthenticationProperties() { RedirectUri = returnUrl });
}
[Authorize]
public async Task Logout()
{
await HttpContext.SignOutAsync("MyOIDC", new AuthenticationProperties
{
RedirectUri = Url.Action("Index", "Home")
});
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}
/Account/Login?ReturnUrl=%2F
,但并没有重定向到授权服务。我该如何改变这种行为? - user11114520SignInManager.IsSignedIn(User)
现在返回false到_LoginPartial.cshtml
,即使用户实际上已经被授权并且我可以读取他的声明? - user11114520SignInManager
是在 ASP.NET Core Identity 中定义的。由于我们从未在此处使用过 ASP.NET Core Identity,因此它肯定不起作用。 - itminus