作者:手机用户2502862865 | 来源:互联网 | 2022-12-02 17:13
1> poke..:
使用OpenID Connect方案时要了解的重要一点是,该方案永远不会独立运行。在几乎每个示例中,您都可以找到它与COOKIE方案的结合。原因很简单:OIDC用于通过外部身份验证提供程序对用户进行身份验证。但是该身份验证只是暂时的。为了将其本地存储在应用程序中,您需要登录用户。这通常是通过COOKIE身份验证方案完成的(尽管它可以通过其他方式完成)。
使用OIDC和COOKIE的应用程序的身份验证流程通常如下所示:
用户访问您的应用程序。
身份验证:COOKIE方案(默认身份验证方案)将尝试对用户进行身份验证。如果没有COOKIE,则处理程序将挑战身份验证。
质询:OIDC方案(默认质询方案)将质询用户并重定向到外部身份验证提供程序。
用户将通过外部身份验证提供程序进行身份验证,并将重定向到应用程序。
质询回调:OIDC方案将从外部身份验证提供程序获得响应,完成质询并创建声明主体。
登录:OIDC方案将使用其配置的登录方案(COOKIE方案)登录该主体。
COOKIE方案将登录用户并创建一个持久保存在用户浏览器中的COOKIE。
在对您的应用程序的后续请求中,用户将包括有效的COOKIE,因此COOKIE方案可以成功验证用户身份,而无需再次挑战OIDC方案。
因此,假设一切正常,OIDC方案将不再参与身份验证。而是每次都会使用COOKIE中的身份。
您可以将其用于您的目的,以扩展OIDC方案使用其他声明创建的主体,然后再通过COOKIE方案对其进行登录和持久化。你可以做到这一点使用自定义登录方案的OIDC和饼干方案之间坐镇,或者你可以简单地附加到被调用的OIDC方案的认证事件后面临的挑战是完成了,但之前的登录会出现。
您可以将TicketReceived
事件用于此目的:
public void ConfigureServices(IServiceCollection services)
{
// …
services.AddAuthentication(optiOns=>
{
options.DefaultScheme = COOKIEAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCOOKIE()
.AddOpenIdConnect(optiOns=>
{
// …
options.Events.OnTicketReceived= OnOpenIdConnectTicketReceived;
});
}
public static Task OnOpenIdConnectTicketReceived(TicketReceivedContext context)
{
if (context.Principal.Identity is ClaimsIdentity identity)
{
identity.AddClaim(new Claim("foo", "bar"));
}
return Task.CompletedTask;
}