2017-04-07 55 views
2

我很难尝试使用Azure AD B2C来验证My Web API。 我将从一些背景开始Azure AD B2C错误 - IDX10501:签名验证失败

我创建了使用Azure AD B2C对用户进行身份验证的移动应用程序。我创建其中显示该网址的网页视图: enter image description here

要求用户登录到蔚蓝的广告,如果登录数据是全成我收到包含访问令牌的响应 - 这部分又光滑,一切正常正常。

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

我更新了所有必需的配置属性以匹配我的天蓝色设置。在这一点上,我希望能够使用我在移动应用程序上收到的访问令牌调用API。我在本地运行移动应用程序,登录,收到访问令牌,将其复制并尝试使用邮递员(授权头“Bearer ...”)呼叫我的web api(以IIS express托管)。不幸的是,没有运气 - 我收到401与下面的头:

承载错误=“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中的日志:

承载未通过身份验证失败消息:IDX10501:签名 验证失败无法匹配“孩子”。“ ...'

+2

您的权限可能是错误的。我不太清楚B2C需要什么,但我认为它会是一个包含您的政策ID的网址。 – juunas

+0

您让我朝着正确的方向发展,谢谢! – MajkeloDev

回答

5

@juunas评论帮我找到问题。余检查使用Fiddler传出请求,我发现,与此片的代码:

管理局=配置[ “认证:AzureAd:AADInstance”] +配置[ “认证:AzureAd:TenantId”]

请求被作为发送到以下地址:

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

钍有以下两个问题:

  1. 它没有使用v2端点。正确的链接,B2C应该总是使用V2所以它看起来像:

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

  • 这不是添加在政策标志的链接(即使我将它设置在令牌选项)
  • 我设法使其与删除“管理局”参数和更改配置工作身份验证功能如下:

    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"], 
    }); 
    
    +0

    我不能告诉你我浪费了多少时间,然后我遇到了你的答案。完全为我做。我只需要上面显示的格式中的Audience和MetadataAddress。感谢这篇文章。 –

    +0

    很高兴帮助你,我也花了很多时间来找到这个解决方案 – MajkeloDev