angular - 从 Angular 7 (MSAL) 调用 ASP.NET Core 2.2 时颁发者无效

标签 angular asp.net-core-webapi openid-connect azure-ad-b2c msal

带有 Azure AD B2C 的 ASP.NET Core 2.2 应用程序(使用 URL 端点 v2.0):

我将核心应用程序配置为如下 AppSettings.js:

"AzureAdB2C": {
  "Instance": "https://login.microsoftonline.com/tfp",
  "ClientId": "{ClientIdGuid}",
  "Domain": "{Subdomain}.onmicrosoft.com",
  "SignUpSignInPolicyId": "B2C_1_SignUpSignInDevelopment"
}

启动:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
    .AddAzureADB2CBearer(o => Configuration.Bind("AzureAdB2C", o));    
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseAuthentication();
    app.UseMvc(o=>{o.MapRoute(name:"d",template:"{controller}/{action=Index}/{id?}");});   
}

我的 Angular 7 客户端使用具有以下设置的 MSAL:

MsalModule.forRoot({
  clientID: environment.azureB2CClientID,
  authority: "https://" + environment.azureTenantIDSubdomain + ".b2clogin.com/tfp/" +
    environment.azureTenantIDSubdomain + ".onmicrosoft.com/" +
    environment.azureSignUpSignInPolicyId + "/v2.0",
  redirectUri: environment.schemeAndAuthority + "/home",
  validateAuthority: false,
  cacheLocation : "localStorage",
  postLogoutRedirectUri: environment.schemeAndAuthority + "/",
  popUp: false
}),

在调用 API 时会生成此 Bearer JWT:

"exp": 1547479156,
"nbf": 1547475556,
"ver": "1.0",
"iss": "https://{Subdomain}.b2clogin.com/{Guid1}/v2.0/",
"sub": "{Guid2}",
"aud": "{Guid3}",
"nonce": "{Guid4}",
"iat": 1547475556,
"auth_time": 1547475556,
"oid": "{Guid5}",
"tfp": "B2C_1_SignUpSignInDevelopment"

我的 .well-known 看起来像这样:https://login.microsoftonline.com/tfp/ {子域}.onmicrosoft.com/B2C_1_SignUpSignInDevelopment/.well-known/openid-configuration

{
  "issuer": "https://login.microsoftonline.com/{ClientGuid}/",
  "authorization_endpoint": "https://login.microsoftonline.com/te/{Subdomain}.onmicrosoft.com/b2c_1_signupsignindevelopment/oauth2/authorize",
  "token_endpoint": "https://login.microsoftonline.com/te/{Subdomain}.onmicrosoft.com/b2c_1_signupsignindevelopment/oauth2/token",
    ...
}

每当我调用我的 [Authorize] protected API Controller (ASP.NET Core 2.2) 时,我都会收到 401:

www-authenticate: Bearer error="invalid_token", error_description="The issuer is invalid"

我意识到 .well-known 中的 Issuer 与生成的 Bearer JWT 不同。但我没有在 Angular 端或 Azure AD B2C 端设置发行者。

这个问题是由 Angular 和 Azure AD B2C 端的不同发行者引起的吗?如果是这样,我应该更改哪个发行人以及如何更改?

最佳答案

您必须确保客户端应用程序和 API 应用程序的颁发者域一致;否则,客户端应用程序将获得一个颁发者域的访问 token ,而 API 应用程序正在为另一个颁发者域验证它。

您将 {tenant}.b2clogin.com 用于客户端应用程序,将 login.microsoftonline.com 用于 API 应用程序。

我建议您同时使用 {tenant}.b2clogin.com

关于angular - 从 Angular 7 (MSAL) 调用 ASP.NET Core 2.2 时颁发者无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183904/

相关文章:

Angular2 检索具有类名的所有元素

node.js - CORS 将 HTTP 请求锁定到在 Firebase 上提供的 Angular 上的 Elasticsearch 服务器

Angular Material 自定义组件主题

mysql - EF Core MySQL Contains(variable) like operator

javascript - Angular:刷新浏览器页面后无法重新加载数据

c# - Asp.net core WEB API 安全的第三方中间件路由?

microservices - AddTransientHttpErrorPolicy和AddPolicyHandler有什么区别?

Azure AD guest 用户多重身份验证

ruby-on-rails - Open ID Connect 提供商 - 保留 ID token ?

asp.net-core - 如何在 .Net Core 3.1 中的 OpenId 连接时禁用 ssl 证书验证?