authentication - 在 Asp.Net Core Web 应用中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal

标签 authentication asp.net-core azure-web-app-service azure-active-directory

我们有一个基于 Asp.Net core 构建的 Web 应用程序。它不包含任何配置的身份验证中间件。

我们托管在 Azure 应用服务上,并使用身份验证/授权选项 (EasyAuth) 针对 Azure AD 进行身份验证。

身份验证运行良好 - 我们插入了必要的 header ,并且可以在/.auth/me 中看到经过身份验证的身份。但 HttpContext.User 属性不会被填充。

这是 Asp.Net core 的兼容性问题吗?还是我做错了什么?

最佳答案

我创建了一个自定义中间件来填充 User 属性,直到 Azure 团队解决这个问题。

它从应用服务身份验证中读取 header ,并创建一个将由 [Authorize] 识别的用户,并对 name 拥有声明。

// Azure app service will send the x-ms-client-principal-id when authenticated
app.Use(async (context, next) =>
{

    // Create a user on current thread from provided header
    if (context.Request.Headers.ContainsKey("X-MS-CLIENT-PRINCIPAL-ID"))
    {
        // Read headers from Azure
        var azureAppServicePrincipalIdHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"][0];
        var azureAppServicePrincipalNameHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"][0];

        // Create claims id
        var claims = new Claim[] {
        new System.Security.Claims.Claim("http://schemas.microsoft.com/identity/claims/objectidentifier", azureAppServicePrincipalIdHeader),
        new System.Security.Claims.Claim("name", azureAppServicePrincipalNameHeader)
        };

        // Set user in current context as claims principal
        var identity = new GenericIdentity(azureAppServicePrincipalIdHeader);
        identity.AddClaims(claims);

        // Set current thread user to identity
        context.User = new GenericPrincipal(identity, null);
    };

    await next.Invoke();
});

关于authentication - 在 Asp.Net Core Web 应用中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42354479/

相关文章:

c# - HTTP 错误 500.30 - ANCM 进程内启动失败 Asp.net-Core 3.1

azure - 用于在 Azure Web App 上重新启动高级应用程序的 Powershell

authentication - RESTful 服务认证

c# - 在自定义AuthorizeAttribute中获取Post请求参数

C# HttpClient GET 返回 200 但为空数组

c# - 如何获取 token 声明值并注入(inject) dbcontext 服务

azure - 使用 Rest Api 创建 Azure 虚拟机后,我可以更改虚拟机自动关闭时间吗?

javascript - 如何在 JavaScript 中检测 SharePoint 2013/2016 身份验证模式

ios - Linkedin iOS 身份验证需要启动 Linkedin 应用程序

asp.net-core - 在 VS 2017 RC 中创建 ASP.NET Core Web App 时缺少 web.config?