【问题标题】:Azure AD B2C - IDX20803: Unable to obtain configuration from: 'System.String'. (.Net 5 Web API + angular)Azure AD B2C - IDX20803:无法从“System.String”获取配置。 (.Net 5 Web API + 角度)
【发布时间】: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.ConfigurationManager1.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 团队,您必须将其添加到您的异常中!

  1. 添加有意义的例外
  2. 如果我不想使用 SignUpSignIn 政策(我不需要任何陌生人去注册我的应用),为什么它没有记录和支持?
  3. 一定要使用可选的日志记录,它会告诉开发人员出了什么问题/遗漏了什么!
  4. 使用 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


【解决方案1】:

【讨论】:

  • 我不需要注册登录政策 - 我不希望任何用户去注册我的应用程序!我只需要登录策略。
  • 这不是重点,键名很重要。它用于构建 OIDC 元数据 url,并不意味着您需要或将具有注册能力。
  • 为什么首先需要注册/登录政策?!这是 API,而不是客户端。
  • 这是因为它构成了 AAD B2C 中权限的一部分,因此必须有一个 policyId 来构造承载令牌签名密钥的 OIDC 元数据 URL。 SUSI 是最常见的,因此是键名。
  • @JasSuri-MSFT 如,这是对最初用于发行令牌的策略的引用?所以实际上没有进行任何身份验证,这纯粹是为了验证令牌本身?
猜你喜欢
  • 2021-04-29
  • 2020-06-26
  • 2022-01-15
  • 2021-08-04
  • 2021-07-15
  • 1970-01-01
  • 2016-04-18
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多