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

时间:2017-04-07 11:27:35

标签: c# azure asp.net-core azure-active-directory azure-ad-b2c

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

我创建了使用Azure AD B2C对用户进行身份验证的移动应用程序。我正在创建一个显示此URL的WebView: enter image description here

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

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

我更新了所有必需的配置属性以匹配我的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
        });

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

修改

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

  

Bearer未经过身份验证。失败消息:IDX10501:签名   验证失败。无法匹配'kid':'...'

1 个答案:

答案 0 :(得分:8)

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

  

授权=配置["身份验证:AzureAd:AADInstance"] +配置["身份验证:AzureAd:TenantId"]

请求被发送到以下地址:

  

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

上面有两个问题:

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

    https://login.microsoftonline.com/MYTENANTID/ 2.0 /。众所周知/ OpenID的配置

    1. 它没有在链接中添加登录策略(即使我在令牌选项中设置了它)
    2. 我设法让它与删除"权限"参数并将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"],
      });