从 Angular 7 (MSAL) 调用 ASP.NET Core 2.2 时颁发者无效
Issuer is Invalid when calling ASP.NET Core 2.2 from Angular 7 (MSAL)
ASP.NET Core 2.2 应用程序与 Azure AD B2C(使用 URL Endpooint 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
}),
在调用 APIs 时生成此 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/{Subdomain}.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 控制器(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 应用程序的颁发者域一致;否则,客户端应用程序将获得一个颁发者域的访问令牌,并且 API 应用程序正在为另一个颁发者域验证它。
您正在为客户端应用程序使用 {tenant}.b2clogin.com
,为 API 应用程序使用 login.microsoftonline.com
。
我建议你对两者都使用 {tenant}.b2clogin.com
。
ASP.NET Core 2.2 应用程序与 Azure AD B2C(使用 URL Endpooint 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
}),
在调用 APIs 时生成此 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/{Subdomain}.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 控制器(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 应用程序的颁发者域一致;否则,客户端应用程序将获得一个颁发者域的访问令牌,并且 API 应用程序正在为另一个颁发者域验证它。
您正在为客户端应用程序使用 {tenant}.b2clogin.com
,为 API 应用程序使用 login.microsoftonline.com
。
我建议你对两者都使用 {tenant}.b2clogin.com
。