簡體   English   中英

Azure AD B2C - IDX20803:無法從“System.String”獲取配置。 (.Net 5 Web API + 角度)

[英]Azure AD B2C - IDX20803: Unable to obtain configuration from: 'System.String'. (.Net 5 Web API + angular)

我有一個 Angular 應用程序和一個 Web Api 應用程序 (.Net 5.0),我需要一個用戶通過 Azure AD B2C 進行身份驗證。 因此,當用戶需要到達某個受保護的路由時,他將被重定向到 B2C 登錄頁面,經過身份驗證並重定向回 angular 應用程序。 這個 Angular 部分有效,這里沒問題。

現在,當 Angular 應用程序向受保護的 Web API (.Net 5) 發出請求時,這個 web api 應該授權該請求。 我以前在.Net Core 的以前版本中做過這個。 但這是新的 shiny Microsoft Identity web。它不起作用。

設置

appsettings.json 用於 B2C

  "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 - 配置服務()

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(字符串地址, 1.GetConfigurationAsync(CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.ConfigurationManager取消) 1.GetConfigurationAsync(CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync(CancellationToken cancel) 在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 在 Microsoft.AspNetCore。 Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() 在 Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync() 在 Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (H T tpContext 上下文)在 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 策略(我不需要任何陌生人 go 並在我的應用程序中注冊),為什么它沒有記錄和支持?
  3. 請使用可選的日志記錄,它會告訴開發人員什么是錯誤的/遺漏的!
  4. 使用構建器模式來創建配置。 那么在特定情況下應該更容易識別配置的哪一部分丟失了。

結果

 "AzureAdB2C": {
    "Instance": "",
    "Domain": "",
    "TenantId": "",
    "ClientId": "",
    "Authority": "",
    "CallbackPath": "/signin-oidc"

管理局不見了。 文檔確實很差!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM