如何让 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 2.x 全面教程_ASP.NET Core MVC 25. 过滤器
如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?