ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?

Posted

技术标签:

【中文标题】ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?【英文标题】:ASP .NET Core OpenID Connect - Issuing my own cookie after external login? 【发布时间】:2021-05-31 23:43:44 【问题描述】:

我正在使用 OpenID Connect nuget 包 (Microsoft.AspNetCore.Authentication.OpenIdConnect) .NET 5 Web API,以便通过 Azure AD(个人或工作帐户)登录用户。这一切都是通过 Startup.cs 中的设置完成的:

services.AddAuthentication(sharedOptions =>

    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
)
    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, "AAD", o =>
    
        o.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        o.UsePkce = true;

        o.Authority = "https://login.microsoftonline.com/common/v2.0";
        o.RequireHttpsMetadata = false; // dev only

        o.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
        o.ClientId = "azure AD application ID";
        o.ClientSecret = "my secret";
        o.ResponseType = OpenIdConnectResponseType.Code;
        o.ResponseMode = OpenIdConnectResponseMode.Query;
        o.CallbackPath = "/auth/microsoft/callback";

        o.TokenValidationParameters.ValidateAudience = true;
        o.TokenValidationParameters.ValidateIssuer = true;
        o.TokenValidationParameters.ValidAudience = "azure AD application ID";
        o.TokenValidationParameters.ValidIssuers = new List<string>
        
            "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", // for personal account login
            // add other tenant ID's here
        ;
    )
    .AddCookie(o =>
    
        o.Events.OnRedirectToAccessDenied = context =>
        
            // Return an Access Denied code rather than the Cookie default of /Account/AccessDenied page
            context.HttpContext.Response.StatusCode = 401;
            return Task.CompletedTask;
        ;
    );

这很好用,我的用户通过 Cookie 进行身份验证,并且可以访问受 [Authorize] 属性限制的路由。 HttpContext.User 包含有关 Azure AD 用户的声明 - 例如“主题”、他们的电子邮件、首选用户名和租户 ID。

但是,我的应用程序有它自己的 User 类,我想将它自己的东西添加到声明中。 我只想将 OpenID Connect 用于登录部分 - 在“UserLogins”表中查找用户,该表包含有关用户外部登录(Microsoft、Google 等)的信息。在我看来,这就是它的样子:

    用户通过 OpenID Connect 提供程序进行身份验证。 我得到了用户“主题”,这是他们对该提供商的唯一 ID。 我使用主题在“UserLogins”数据库表中查找记录,并将其与“Users”表中的记录相匹配。 我发布了我自己的 cookie,其中包含与我的应用程序相关的声明(例如用户表中的“UserId”)

最好的方法是什么? 我是否继续使用 Azure AD 发布的 Cookie?还是发布我自己的 Cookie 是一个不错的选择? 我是否必须为此设置不同的 Cookie 身份验证方案? 我在想我可能会使用 IClaimsTransformation 将与我的应用程序相关的声明添加或覆盖到同一个 Cookie,但不确定这是否是“正确”的方法。

【问题讨论】:

【参考方案1】:

关于经过身份验证的用户的声明由 OpenID 提供者声明,您无法修改它们。如果您想向前端应用程序传递更多声明,则必须将其放入不同的令牌或 cookie 中。如果您只需要后端的数据,您可以在收到请求时从数据库中读取。

【讨论】:

以上是关于ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?

Asp.Net Core API OpenId-Connect 身份验证与 JWT 令牌使用 IdentityModel

ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

OpenID Connect 与 ASP NET Core 3.1 没有众所周知的 URL

同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证

如何通过 IdentityServer4 将 OpenId Connect 添加到 ASP.NET Core 服务器端 Blazor Web 应用程序?