使用Azure App Service身份验证的.NET Core应用程序

时间:2018-03-07 12:27:26

标签: azure authentication azure-active-directory asp.net-core-2.0

我的webapp是使用.NET Core开发的,并部署在Azure中。我已启用Azure App Service身份验证并将其配置为使用Azure Active Directory。 当我访问webapp时,我会被重定向到正确的登录页面。 登录后,我可以浏览到端点.auth / me,并查看我的用户存在声明。我还可以验证下面的请求标头是否存在值:

  • X-MS-TOKEN-AAD-ID-TOKEN
  • X-MS-TOKEN-AAD-ACCESS-TOKEN
  • X-MS-TOKEN-AAD-EXPIRES-ON
  • X-MS-TOKEN-AAD-REFRESH-TOKEN

但是我无法在控制器中检索这些声明。 使用User.Identity.isAuthenticated始终为false,User.Identity.Claims为空。

如何让用户进行身份验证并检索声明?

理论上我可以检查请求标头(X-MS-TOKEN-AAD-ID-TOKEN)是否存在,然后检索端点上存在的声明.auth / me但是看起来并不像正确的方法?

编辑: 我是否磕磕绊绊在这里讨论的同一个问题? (Trouble getting ClaimsPrincipal populated when using EasyAuth to authenticate against AAD on Azure App Service in a Asp.Net Core web app

1 个答案:

答案 0 :(得分:2)

正如Working with user identities in your application所述:

  

App Service使用特殊标头将一些用户信息传递给您的应用程序。外部请求禁止这些标头,只有在通过App Service Authentication / Authorization设置时才会出现。一些示例标题包括:

     
      
  • X-MS-CLIENT主体名称
  •   
  • X-MS-CLIENT-委托ID
  •   
  • X-MS-TOKEN-FACEBOOK-ACCESS-TOKEN
  •   
  • X-MS-TOKEN-FACEBOOK-EXPIRES-ON
  •   
     

以任何语言或框架编写的代码都可以从这些标头中获取所需的信息。对于ASP.NET 4.6应用程序, ClaimsPrincipal 会自动设置适当的值。

     

我们的应用程序还可以通过应用程序/.auth/me端点上的HTTP GET获取其他用户详细信息。请求中包含的有效令牌将返回JSON有效内容,其中包含有关正在使用的提供程序,基础提供程序令牌以及其他一些用户信息的详细信息。

正如Chris Gillum建议您可以调用/.auth/me端点并检索用户声明。您可以编写自定义中间件来检查X-MS-CLIENT-PRINCIPAL-ID标头并调用/.auth/me端点并手动设置用户声明。以下是详细的代码示例,您可以参考此类issue

此外,您可以修改您的应用程序并显式添加身份验证中间件,而不是像evilSnobu评论的那样使用App Service身份验证/授权(EasyAuth)。对于这种方法,您可以使用ASP.Net Core OpenID Connect中间件,详细信息可以按照以下教程进行:

Integrating Azure AD (v2.0 endpoint) into an ASP.NET Core web app

Integrating Azure AD into an ASP.NET Core web app