c# - 使用带有 Azure AD 的 ASP.NET Core MVC 对 ASP.NET Core WebAPI 进行身份验证
问题描述
我有两个 Web 应用程序:一个ASP.NET Core MVC 网站和一个ASP.NET Core Web API(使用 ASP.NET Core 2.1)。
我使用 Azure AD 对网站中的用户进行身份验证。当我将 access_token 从网站传递到 API 时(使用带有“Bearer access_token”的授权标头);我有这个错误:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503:签名验证失败。尝试的键:'Microsoft.IdentityModel.Tokens.X509SecurityKey,KeyId:...'。
我不明白为什么。
这是网站的配置:
services.AddAuthentication(o =>
{
o.DefaultChallengeScheme = "aad";
o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o =>
{
o.Authority = azureAdsettings.Authority;
o.Audience = azureAdsettings.ClientId;
})
.AddCookie()
.AddOpenIdConnect("aad", o =>
{
o.Authority = azureAdsettings.Authority;
o.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
o.ClientId = azureAdsettings.ClientId;
o.ClientSecret = azureAdsettings.ClientSecret;
o.ResponseType = OpenIdConnectResponseType.CodeIdToken;
o.SaveTokens = true;
o.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = azureAdsettings.Authority
};
o.Events = new OpenIdConnectEvents
{
OnTicketReceived = ctx =>
{
return Task.CompletedTask;
},
OnAuthorizationCodeReceived = async ctx =>
{
TokenProvider tokenProvider = (TokenProvider)ctx.HttpContext.RequestServices.GetRequiredService<ITokenProvider>();
await tokenProvider.AcquireTokenByAuthorizationCodeAsync(ctx);
},
OnAuthenticationFailed = context =>
{
context.Response.Redirect("/Error");
context.HandleResponse(); // Suppress the exception
return Task.CompletedTask;
},
};
});
这是 API 的配置:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Authority = this.Configuration["AzureAd:Authority"];
options.Audience = this.Configuration["AzureAd:ClientId"];
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.IssuerValidator = ValidateIssuer;
});
azureAdsettings对象在两个 appsettings.json 中完全相同。
网站上的身份验证似乎运行良好。我可以获得授权码并检索访问令牌。
解决方案
推荐阅读
- javascript - 带有 Django 模板的内部 HTML if 语句使用 Js 变量
- interface - 在fortran中,为什么接口有名字?调用接口时它做了什么?
- ios - 如何通过 dart ffi 添加 iOS 支持而不添加 Flutter sdk 作为依赖项?
- php - 如何在 WooCommerce 的结帐页面上重新排序其他字段
- javascript - 方法异步时如何存储从数据库返回的值
- python - 以这种特定格式打印嵌套列表
- rocksdb - RocksDB 总内存使用量
- http - 对 CORS 请求的 304 Not Modified 响应是否应该包含 CORS 标头?
- javascript - 即使 xpaths 和 querySelector 应该可以工作,也无法关闭 html 弹出窗口
- javascript - 三点投影JS