如何让 mvc 管道在 .net core 5 中对 oidc 进行身份验证

Posted

技术标签:

【中文标题】如何让 mvc 管道在 .net core 5 中对 oidc 进行身份验证【英文标题】:How to get mvc pipeline to authenticate oidc in .net core 5 【发布时间】:2021-12-29 19:49:00 【问题描述】:

我正在尝试找出一种让 mvc 对 AzureAD oidc 令牌进行身份验证的方法。我的应用程序只是后端,没有登录或注销。所以我想从OnAuthorizationAsync(**AuthorizationFilterContext** context) 获取用户声明,但它在httpcontext 中总是返回空。我认为这可能是AddOpenIdConnect 中的某种配置问题。以下是我在ConfigureServices 中的设置。需要做些什么才能获得用户声明?

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme
        //    options =>
        //
        //    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        //    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; //AuthorizationConstants.AuthenticationSchemes.Oidc
        // //behave the same with or without this setting
        )
        .AddOpenIdConnect("oidc", options =>
        
            options.ClientId = azureAdConfig.ClientId;
            options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(azureAdConfig.EntryUrl, new OpenIdConnectConfigurationRetriever());
        );



 Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        // routing and other things
        app.UseAuthentication();
        app.UseAuthorization();
    

【问题讨论】:

嗨@briswill,请首先检查您的令牌是否包含声明。您可以在this website 中对令牌进行编码。 嘿 @Rena,我们使用了 Microsoft AzureAd 登录令牌,它在令牌中包含用户名和用户电子邮件信息。我认为它包含有效的声明。 【参考方案1】:

你所拥有的根本不起作用。 OpenIDConnect 仅处理身份验证部分,但接收到的令牌只是在您的设置中丢失。您遇到的第二个问题是您没有将 JwtBearer 与 AddOpenIdConnect 混合使用。 JwtBearer 用于从客户端接收访问令牌的 API。

您需要配置的适当框架是:

services.AddAuthentication(options =>

    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
).AddCookie(opt =>

).AddOpenIdConnect(options =>

);

您应该将 OpenIDConnectHandler 与 Cookie 处理程序结合使用。然后就可以了。

查看这篇文章了解更多详情: How do I implement Blazor authentication with OpenID Connect?

【讨论】:

感谢您的信息。我已经尝试了解决方案的建议。我们使用 AzureAd 进行身份验证。令牌中还有“name”和“preferred_username”以及“iss”、“aud”、“scp”等其他声明。不确定这些选项中还需要设置什么。 您对索赔有何疑问? 如果您使用的是 AzureAd,那么我建议您查看 docs.microsoft.com/en-us/azure/active-directory/develop/… 库,您可以将其视为 AddCookie/AddOpenIdConnect 的超集,可以处理很多魔法给你。 如果我的回答回答了您的问题,请随时接受我的回答。 感谢 Tore,我已经尝试过 Microsoft.Identity.Web;它确实像魔术一样工作。感谢 cmets services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApi(config, "AzureAd");

以上是关于如何让 mvc 管道在 .net core 5 中对 oidc 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 过滤器介绍

.Net Core MVC理解新管道处理模型中间件

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?

如何让asp.net core mvc发布时候不编译cshtml视图

asp.net core2 mvc 基础教程--服务注册和管道