【发布时间】:2021-09-10 03:23:23
【问题描述】:
我有一个 Angular 应用程序和一个 Web Api 应用程序 (.Net 5.0),我需要一个用户通过 Azure AD B2C 进行身份验证。因此,当用户需要到达某个受保护的路线时,他将被重定向到 B2C 登录页面,经过身份验证并重定向回 Angular 应用程序。这个 Angular 部分可以工作,这里没问题。
现在,当 Angular 应用程序向受保护的 Web API (.Net 5) 发出请求时,该 Web API 应该授权该请求。我以前在 .Net Core 的早期版本中已经这样做过。但这是新的闪亮的 Microsoft Identity 网络。而且它不起作用。
设置
适用于 B2C 的 appsettings.json
"AzureAdB2C": {
"TenantId": "[Tenant Guid]",
"Instance": "https://[tenant name].b2clogin.com/",
"ClientId": "[web api client Id]",
"Domain": "[tenant name].onmicrosoft.com",
"SignInPolicyId": "B2C_1_signin"
},
startup.cs - ConfigureServices()
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.TokenValidationParameters.NameClaimType = "name";
},
options => { Configuration.Bind("AzureAdB2C", options); });
// Creating policies that wraps the authorization requirements
services.AddAuthorization();
services.AddApplication();
services.AddInfrastructure(Configuration);
services.AddRouting(options => options.LowercaseUrls = true);
services.AddMemoryCache();
services.AddControllers().AddNewtonsoftJson();
startup.cs - 配置()
...
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
// endpoints.MapRazorPages();
endpoints.MapControllers();
});
通过此设置,我得到的只是非常描述性错误:
System.InvalidOperationException:IDX20803:无法从“System.String”获取配置。 ---> System.IO.IOException:IDX20807:无法从“System.String”检索文档。 HttpResponseMessage:'System.Net.Http.HttpResponseMessage',HttpResponseMessage.Content:'System.String'。 在 Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(字符串地址,CancellationToken 取消) 在 Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(字符串地址,IDocumentRetriever 检索器,CancellationToken 取消) 在 Microsoft.IdentityModel.Protocols.ConfigurationManager
1.GetConfigurationAsync(CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.ConfigurationManager1.GetConfigurationAsync(CancellationToken 取消) 在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 在 Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync() 在 Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext 上下文,字符串方案) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)
但后来我将这个“助手”糖配置更改为以下内容:
services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; })
.AddJwtBearer(jwtOptions =>
{
jwtOptions.Authority = $"{Configuration["AzureAdB2C:Instance"]}/{Configuration["AzureAdB2C:TenantId"]}/{Configuration["AzureAdB2C:SignInPolicyId"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = AuthenticationFailed
};
});
而且它有效!
那么有没有关于如何真正配置 MS Identity Web 的好文档?为什么异常中没有准确的描述说明缺少什么?
更新
感谢您的回答,但这个 Identity Web 实现真的很差。
此异常的原因是 SignUpSignInPolicyId 未定义或拼写错误! Microsoft 团队,您必须将其添加到您的异常中!
- 添加有意义的例外
- 如果我不想使用 SignUpSignIn 政策(我不需要任何陌生人去注册我的应用),为什么它没有记录和支持?
- 一定要使用可选的日志记录,它会告诉开发人员出了什么问题/遗漏了什么!
- 使用 Builder 模式创建配置。那么在特定情况下应该更容易确定配置的哪一部分丢失。
【问题讨论】:
-
异常表明您可以访问 OIDC 元数据端点。该 URL 是使用权威构造的,权威是使用实例、tenantId 和 policyId 构造的。由于某种原因,默认配置似乎无法构建/检索该 URL。
-
1) 一个例子 - 这将不起作用,启动 services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C"); 2) “异常状态表明您可以到达 OIDC 元数据端点”——真的吗?在哪里?在异常文本中显示这个。 3) 为什么这不能告诉我缺少哪个部分?
-
我对
Microsoft.Identity.Web感到很痛苦,文档和支持非常糟糕,尤其是对于 .Net 5.0。
标签: c# asp.net angular azure azure-ad-b2c