Azure AD B2C 错误 - IDX10501:签名验证失败
Azure AD B2C error - IDX10501: Signature validation failed
我在尝试使用 Azure AD B2C 对我的网站进行身份验证时遇到困难 API。
我将从一些背景开始
我创建了使用 Azure AD B2C 对用户进行身份验证的移动应用程序。我正在创建一个显示此 url 的 WebView:
用户被要求登录 azure ad,如果登录数据成功,我将收到包含访问令牌的响应 - 这部分很顺利,一切正常。
现在我想创建后端 Web Api。我创建了 ASP NET Core Web 应用程序,它允许我选择身份验证方法。我选择 Azure AD 身份验证,因此模板为我生成了所有必需的数据。代码中的相关部分在这里:
我更新了所有必需的配置属性以匹配我的 azure 设置。在这一点上,我希望能够使用我在移动应用程序上收到的访问令牌来调用 API。我 运行 在本地移动应用程序,登录,收到访问令牌,复制它并尝试使用邮递员(授权 header “Bearer .. ”)。不幸的是没有运气 - 我收到 401 以下 header:
Bearer error="invalid_token", error_description="The signature key was
not found"
我认为令牌足以授权 API - 我知道这是 OAuth 的一个重点。我错过了什么吗?我应该有一些额外的配置吗?我注意到配置缺少登录策略(这似乎是 AD B2C 名称所必需的,所以我尝试添加:
var validationParameters = new TokenValidationParameters
{
AuthenticationType = "MY_POLICY",
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
Audience = Configuration["Authentication:AzureAd:Audience"],
TokenValidationParameters = validationParameters
});
但这也行不通。将不胜感激。
编辑
我在 Visual Studio 日志中发现以下错误:
Bearer was not authenticated. Failure message: IDX10501: Signature
validation failed. Unable to match 'kid': '...'
@juunas 评论帮助我找到问题所在。我用 fiddler 检查了传出请求,发现这段代码:
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"]
请求被发送到以下地址:
https://login.microsoftonline.com/MYTENANTID/.well-known/openid-configuration
以上有两个问题:
- 它没有使用 v2 端点。 B2C 的正确 link 应始终使用 v2,因此它看起来像:
https://login.microsoftonline.com/MYTENANTID/v2.0/.well-known/openid-configuration
- 它没有向 link 添加登录策略(即使我在令牌选项中设置了它)
我设法通过删除 "Authority" 参数并将配置身份验证功能更改为以下内容来使其工作:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
MetadataAddress = string.Format("https://login.microsoftonline.com/{0}/v2.0/.well-known/openid-configuration?p={1}",
Configuration["Authentication:AzureAd:TenantId"], "MYPOLICY"),
AuthenticationScheme = "MYPOLICY",
Audience = Configuration["Authentication:AzureAD:ClientId"],
});
我在尝试使用 Azure AD B2C 对我的网站进行身份验证时遇到困难 API。 我将从一些背景开始
我创建了使用 Azure AD B2C 对用户进行身份验证的移动应用程序。我正在创建一个显示此 url 的 WebView:
用户被要求登录 azure ad,如果登录数据成功,我将收到包含访问令牌的响应 - 这部分很顺利,一切正常。
现在我想创建后端 Web Api。我创建了 ASP NET Core Web 应用程序,它允许我选择身份验证方法。我选择 Azure AD 身份验证,因此模板为我生成了所有必需的数据。代码中的相关部分在这里:
我更新了所有必需的配置属性以匹配我的 azure 设置。在这一点上,我希望能够使用我在移动应用程序上收到的访问令牌来调用 API。我 运行 在本地移动应用程序,登录,收到访问令牌,复制它并尝试使用邮递员(授权 header “Bearer .. ”)。不幸的是没有运气 - 我收到 401 以下 header:
Bearer error="invalid_token", error_description="The signature key was not found"
我认为令牌足以授权 API - 我知道这是 OAuth 的一个重点。我错过了什么吗?我应该有一些额外的配置吗?我注意到配置缺少登录策略(这似乎是 AD B2C 名称所必需的,所以我尝试添加:
var validationParameters = new TokenValidationParameters
{
AuthenticationType = "MY_POLICY",
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
Audience = Configuration["Authentication:AzureAd:Audience"],
TokenValidationParameters = validationParameters
});
但这也行不通。将不胜感激。
编辑
我在 Visual Studio 日志中发现以下错误:
Bearer was not authenticated. Failure message: IDX10501: Signature validation failed. Unable to match 'kid': '...'
@juunas 评论帮助我找到问题所在。我用 fiddler 检查了传出请求,发现这段代码:
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"]
请求被发送到以下地址:
https://login.microsoftonline.com/MYTENANTID/.well-known/openid-configuration
以上有两个问题:
- 它没有使用 v2 端点。 B2C 的正确 link 应始终使用 v2,因此它看起来像:
https://login.microsoftonline.com/MYTENANTID/v2.0/.well-known/openid-configuration
- 它没有向 link 添加登录策略(即使我在令牌选项中设置了它)
我设法通过删除 "Authority" 参数并将配置身份验证功能更改为以下内容来使其工作:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
MetadataAddress = string.Format("https://login.microsoftonline.com/{0}/v2.0/.well-known/openid-configuration?p={1}",
Configuration["Authentication:AzureAd:TenantId"], "MYPOLICY"),
AuthenticationScheme = "MYPOLICY",
Audience = Configuration["Authentication:AzureAD:ClientId"],
});