如何诊断 Microsoft Identity 身份验证失败?
How to diagnose Microsoft Identity authentication failure?
我有一个受 Azure 身份验证保护的 ASP.NET Core 3.1 web API 应用程序。我还有一个 Angular 11 应用程序调用网络 API.
它们在我们的集成环境中运行良好。但是在测试环境中验证失败。
Angular 应用程序使用 msal-angular 库进行身份验证,它获取访问令牌并在调用 Web API 时包含它。但是网络 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 核心网络 api 应用程序的日志中看到以下内容:
IDX10511: Signature validation failed. Keys tried: '[PII is hidden.
For more details, see https://aka.ms/IdentityModel/PII.]'. \nkid:
'[PII is hidden. For more details, see
https://aka.ms/IdentityModel/PII.]
更新:
我收到以下错误:
Bearer was not authenticated. Failure message: IDX10214: Audience
validation failed. Audiences: '242e8f40-d795-43bc-8ac8-8eed3df71745'.
Did not match: validationParameters.ValidAudience:
'b99e89fc-8a1c-4605-8c18-796d7064037e' or
validationParameters.ValidAudiences: 'null'.
'242e8f40-d795-43bc-8ac8-8eed3df71745'是网络上的AppIdapi应用注册清单。
'b99e89fc-8a1c-4605-8c18-796d7064037e'是webapi注册的client 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'
};
}
您的问题已经解决。问题是webapi的配置不对。您需要重新创建它们并重新配置。
根据我的经验,需要在Azure中创建两个应用程序,一个代表webapi应用程序,另一个代表客户端应用程序(即Angular11应用程序)。
然后需要在Azure中暴露webapi应用的api,将Angular11应用作为客户端应用添加到webapi应用中.
最后,在请求access token的时候,需要设置scope为:api://{web api client id}/{scope name}
.
我有一个受 Azure 身份验证保护的 ASP.NET Core 3.1 web API 应用程序。我还有一个 Angular 11 应用程序调用网络 API.
它们在我们的集成环境中运行良好。但是在测试环境中验证失败。
Angular 应用程序使用 msal-angular 库进行身份验证,它获取访问令牌并在调用 Web API 时包含它。但是网络 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 核心网络 api 应用程序的日志中看到以下内容:
IDX10511: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. \nkid: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]
更新:
我收到以下错误:
Bearer was not authenticated. Failure message: IDX10214: Audience validation failed. Audiences: '242e8f40-d795-43bc-8ac8-8eed3df71745'. Did not match: validationParameters.ValidAudience: 'b99e89fc-8a1c-4605-8c18-796d7064037e' or validationParameters.ValidAudiences: 'null'.
'242e8f40-d795-43bc-8ac8-8eed3df71745'是网络上的AppIdapi应用注册清单。
'b99e89fc-8a1c-4605-8c18-796d7064037e'是webapi注册的client 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'
};
}
您的问题已经解决。问题是webapi的配置不对。您需要重新创建它们并重新配置。
根据我的经验,需要在Azure中创建两个应用程序,一个代表webapi应用程序,另一个代表客户端应用程序(即Angular11应用程序)。
然后需要在Azure中暴露webapi应用的api,将Angular11应用作为客户端应用添加到webapi应用中.
最后,在请求access token的时候,需要设置scope为:api://{web api client id}/{scope name}
.