【问题标题】:Azure Apps EasyAuth claims with .NET CoreAzure 应用程序 EasyAuth 声明与 .NET Core
【发布时间】:2017-07-04 18:46:59
【问题描述】:

我想编写一些 ASP .NET Core 中间件来将 Azure Apps EasyAuth HTTP 标头转换为声明。我找到了两种方法:

  1. 解析 EasyAuth 在 HTTP 标头中提供的令牌。这似乎不是一个通用的解决方案,因为我必须编写代码来解析每个身份提供者的令牌。

  2. 向 /.auth/me 发出服务器端请求。这会返回一些我想将其转换为声明的 JSON,但我不确定是否必须手动执行此操作,或者是否有框架支持。

#2 是最好的方法吗?是否有任何框架支持它?

【问题讨论】:

    标签: azure asp.net-core azure-web-app-service


    【解决方案1】:

    根据你的描述,我找到了一个类似的issue。据我所知,目前没有任何框架供您实现它。根据我的理解,如果您希望在使用 Azure App Service EasyAuth 时检索所有声明,我认为您最好向内置端点 /.auth/me 发出服务器端请求以检索声明,如下所示:

    Startup.cs > 配置

    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];
    
            #region extract claims via call /.auth/me
            //invoke /.auth/me
            var cookieContainer = new CookieContainer();
            HttpClientHandler handler = new HttpClientHandler()
            {
                CookieContainer = cookieContainer
            };
            string uriString = $"{context.Request.Scheme}://{context.Request.Host}";
            foreach (var c in context.Request.Cookies)
            {
                cookieContainer.Add(new Uri(uriString), new Cookie(c.Key, c.Value));
            }
            string jsonResult = string.Empty;
            using (HttpClient client = new HttpClient(handler))
            {
                var res = await client.GetAsync($"{uriString}/.auth/me");
                jsonResult = await res.Content.ReadAsStringAsync();
            }
    
            //parse json
            var obj = JArray.Parse(jsonResult);
            string user_id = obj[0]["user_id"].Value<string>(); //user_id
    
            // Create claims id
            List<Claim> claims = new List<Claim>();
            foreach (var claim in obj[0]["user_claims"])
            {
                claims.Add(new Claim(claim["typ"].ToString(), claim["val"].ToString()));
            }
    
            // Set user in current context as claims principal
            var identity = new GenericIdentity(azureAppServicePrincipalIdHeader);
            identity.AddClaims(claims); 
            #endregion
    
            // Set current thread user to identity
            context.User = new GenericPrincipal(identity, null);
        };
    
        await next.Invoke();
    });
    

    【讨论】:

      【解决方案2】:

      我创建了一个中间件,您可以使用它通过 ez auth 在 .net 核心中获得正确的身份。您可以在此处查看我的答案以及指向 nuget 和来源的链接:

      Trouble getting ClaimsPrincipal populated when using EasyAuth to authenticate against AAD on Azure App Service in a Asp.Net Core web app

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 2016-10-04
        • 2020-04-27
        • 2020-02-17
        • 1970-01-01
        • 2018-05-22
        相关资源
        最近更新 更多