具有 Azure 应用服务身份验证的 .NET Core 应用

Posted

技术标签:

【中文标题】具有 Azure 应用服务身份验证的 .NET Core 应用【英文标题】:.NET Core app with Azure App Service Authentication 【发布时间】:2018-08-15 13:23:29 【问题描述】:

我的 webapp 使用 .NET Core 开发并部署在 Azure 中。我已启用 Azure 应用服务身份验证并将其配置为使用 Azure Active Directory。 当我访问 web 应用程序时,我会被重定向到正确的登录页面。 登录后,我可以浏览到端点 .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)

【问题讨论】:

是的,你做对了,阅读标题,解压 id_token 并提取声明。也可以看到这个 - ***.com/a/46765687/4148708。如果您不喜欢这种方法,请放弃 EasyAuth 并直接与 Azure AD 集成(并使用 ADAL .NET)。 【参考方案1】:

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

应用服务通过使用特殊标头将一些用户信息传递给您的应用程序。外部请求禁止这些标头,并且仅在应用服务身份验证/授权设置时才会出现。一些示例标题包括:

X-MS-CLIENT-PRINCIPAL-NAME X-MS-CLIENT-PRINCIPAL-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 评论的那样使用应用服务身份验证/授权 (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

【讨论】:

以上是关于具有 Azure 应用服务身份验证的 .NET Core 应用的主要内容,如果未能解决你的问题,请参考以下文章

身份验证如何在 Azure Functions 上工作

C# - 具有托管服务标识的 Azure 存储 [关闭]

使用 Azure 服务的具有身份验证、授权和持久层的 Xamarin 应用程序

Azure Api 规则不适用于使用具有身份验证基本和身份验证证书的默认助手

AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证

如何将动态重定向 URL 传递到 Azure 应用注册身份验证过程(.NET 框架)?