c# - 如何诊断 Microsoft 身份验证失败?
问题描述
我有一个受 Azure 身份验证保护的 ASP.NET Core 3.1 Web API 应用程序。我还有一个调用 Web API 的 Angular 11 应用程序。
它们在我们的集成环境中运行良好。但在测试环境中身份验证失败。
Angular 应用程序使用 msal-angular 库进行了很好的身份验证,它获取访问令牌并在调用 Web API 时包含它。但是 Web API 无法从不记名令牌中检索身份。
在多次删除并重新创建(前端和后端)Azure APP 注册并重新配置它们后,身份验证仍然失败。我不知道是什么原因,所以这就是为什么我需要诊断它。
我已启用JwtBearerMiddlewareDiagnosticsEvents
,并且可以在日志中看到“Begin OnAuthenticationFailedAsync”和“End OnAuthenticationFailedAsync”。但这还不够信息。它不再告诉您事件已引发,也没有其他信息。
我已阅读以下有关文档的文章,该文章告诉您如何在 MSAL.NET 中配置日志记录,但我认为它不适用于 Web API。
https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-logging-dotnet
所以问题是:我怎样才能找出身份验证失败的原因?有没有办法记录原因?
更新:
我更近了,我将日志级别设置为跟踪,现在我在 asp.net core web api 应用程序的日志中看到以下内容:
IDX10511:签名验证失败。尝试的键:'[PII 被隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII.]'。\nkid: '[PII 被隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII。]
更新:
我收到以下错误:
承载未通过身份验证。失败消息:IDX10214:观众验证失败。观众:'242e8f40-d795-43bc-8ac8-8eed3df71745'。不匹配:validationParameters.ValidAudience: 'b99e89fc-8a1c-4605-8c18-796d7064037e' 或 validationParameters.ValidAudiences: 'null'。
'242e8f40-d795-43bc-8ac8-8eed3df71745' 是 Web api 应用程序注册清单上的 AppId。
'b99e89fc-8a1c-4605-8c18-796d7064037e' 是 Web api 注册的客户端 ID。
范围是'api://242e8f40-d795-43bc-8ac8-8eed3df71745/api-access'。
这就是我设置范围的方式:
export function MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {
const protectedResourceMap = new Map<string, Array<string>>();
protectedResourceMap.set('https://api.example.com/*', ['api://242e8f40-d795-43bc-8ac8-8eed3df71745/api-access']);
return {
interactionType: InteractionType.Popup,
protectedResourceMap
};
}
export function MSALGuardConfigFactory(): MsalGuardConfiguration {
return {
interactionType: InteractionType.Popup,
authRequest: {
scopes: ['api://242e8f40-d795-43bc-8ac8-8eed3df71745/api-access']
},
loginFailedRoute: '/login-failed'
};
}
解决方案
你的问题已经解决了。问题是web api的配置错误。您需要再次创建它们并重新配置 .
根据我的经验,你需要在 Azure 中创建两个应用程序,一个代表 web api 应用程序,另一个代表客户端应用程序(即 Angular 11 应用程序)。
然后需要在 Azure 中公开 web api 应用程序的 api,并将 Angular 11 应用程序作为客户端应用程序添加到 web api 应用程序中。
最后,在请求访问令牌时,您需要将范围设置为:api://{web api client id}/{scope name}
。
推荐阅读
- python - 如何从有条件的主列表中制作几个列表
- json - 我在将 HTML 脚本解码为 JSON 中的字符串值时遇到问题,其他所有值都被转换得很好
- python - 从存储为实例变量的 Entry 小部件中检索输入并在类外部使用它
- delphi-10-seattle - 如何在delphi中将特定的子窗体分配给Activeform
- yarnpkg - 使用 Yarn 工作区时,我可以在根工作区中安装每个 devDependency 吗?或者我应该将它们保存在每个单独的工作区中?
- swift - 依赖注入 pointfree.co-style:有依赖的依赖?
- github - 如何在自定义 vscode github 问题查询中按里程碑组织问题?
- docker - 如何隐藏终止为连续服务的 docker 映像
- javascript - 链接 api 请求和处理
- python - Django - /graphql 处的 ImportError