Azure AD B2C错误 - IDX10501:签名验证失败

Maj*_*Dev 6 c# azure azure-active-directory azure-ad-b2c asp.net-core

我很难尝试使用Azure AD B2C来验证My Web API.我将从一些背景开始

我创建了使用Azure AD B2C对用户进行身份验证的移动应用程序.我正在创建一个显示此URL的WebView: 在此输入图像描述

用户被要求登录azure广告,如果登录数据成功,我收到包含访问令牌的响应 - 这部分顺利进行,一切正常.

现在我想创建后端Web Api.我创建了ASP NET Core Web应用程序,它允许我选择身份验证方法.我选择Azure AD身份验证,以便模板为我生成所有必需的数据.代码中的相关部分在这里: 在此输入图像描述

我更新了所有必需的配置属性以匹配我的azure设置.此时我希望能够使用我在移动应用程序上收到的访问令牌来调用API.我在本地运行移动应用程序,登录,接收访问令牌,复制它并尝试使用邮递员(带有授权标题"Bearer ...")来调用我的web api(在IIS express中托管).不幸的是没有运气 - 我收到401以下标题:

Bearer error ="invalid_token",error_description ="找不到签名密钥"

我认为令牌足以授权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
        });
Run Code Online (Sandbox Code Playgroud)

但这也行不通.将不胜感激任何帮助.

编辑

我在Visual Studio日志中发现以下错误:

持票人未经过认证.失败消息:IDX10501:签名验证失败.无法匹配'kid':'...'

Maj*_*Dev 9

@juunas评论帮助我找到问题.我用fiddler检查了传出的请求,我发现用这段代码:

Authority = Configuration ["Authentication:AzureAd:AADInstance"] + Configuration ["Authentication:AzureAd:TenantId"]

请求被发送到以下地址:

https://login.microsoftonline.com/MYTENANTID/.well-known/openid-configuration

上面有两个问题:

  1. 它不使用v2端点.B2C的正确链接应始终使用v2,因此它看起来像:

https://login.microsoftonline.com/MYTENANTID/ V2.0 /.well-known/openid-configuration

  1. 它没有在链接中添加登录策略(即使我在令牌选项中设置它)

我设法使其删除"Authority"参数并将configure auth函数更改为以下内容:

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"],
});
Run Code Online (Sandbox Code Playgroud)