我的webapp是使用.NET Core开发的,并部署在Azure中。我已启用Azure App Service身份验证并将其配置为使用Azure Active Directory。 当我访问webapp时,我会被重定向到正确的登录页面。 登录后,我可以浏览到端点.auth / me,并查看我的用户存在声明。我还可以验证下面的请求标头是否存在值:
但是我无法在控制器中检索这些声明。 使用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)
答案 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