从ASP.NET Core Web API中的控制器访问用户身份

Pab*_*blo 5 c# azure asp.net-web-api asp.net-core

根据此文档:

ASP.NET Core 2.1文档

我应该能够使用ControllerBase.UserHttpContext.Use r 访问用户身份。

按照上面的链接:

“从应用程序的DI服务集合中获取当前用户的身份也更具可测试性,因为可以轻松注入测试身份。”

据我了解,我应该在Startup.cs或控制器的构造函数中使用依赖项注入来注入身份信息。

但是,经过无休止的调查,我找不到程序。

以下步骤描述了我的情况。我希望有人可以指引我正确的方向。

1)使用Visual Studio 2017,使用以下选项创建ASPNET.core Web API项目:

  • 类型:API
  • 启用Docker支持:否
  • 身份验证:无身份验证
  • 配置HTTPS:是

2)使用以下代码将AuthDetailsController.cs添加到Controllers文件夹:

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : Controller
    {


        [HttpGet]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

3)作为新应用程序部署到Azure

4)导航到https:// [site_name] .azurewebsites.net / api / AuthDetails

5)没有有关用户身份的信息,因为访问是匿名的:

{"User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"}],"User.Claims":[],"HttpContext.User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"}],"HttpContext.User.Claims":[]}
Run Code Online (Sandbox Code Playgroud)

6)使用以下选项启用Azure身份验证:

  • 未验证请求时应采取的措施:使用Azure Active Directory登录。
  • Azure Active Directory配置:快速模式

7)再次打开https:// [site_name] .azurewebsites.net / api / AuthDetails

8)您将被重定向到登录页面

9)成功登录后,ControllerBase.User和HttpContext.User中都没有身份信息。响应与启用身份验证之前相同。

Pab*_*blo 0

我做到了 !!!

文档为我指明了正确的方向。

这些是重现我的场景的步骤:

1) 使用 Visual Studio 2017,使用以下选项创建 ASPNET.core Web API 项目:

  • 类型:API
  • 启用 Docker 支持:否
  • 认证:无认证
  • 配置 HTTPS:是

2)将AuthDetailsController.cs添加到Controllers文件夹中,代码如下:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApiTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : ControllerBase
    {
        // GET: api/AuthDetails
        [HttpGet]
        public Dictionary<string,string> Get()
        {
            return new Dictionary<string, string> { {"X-MS-CLIENT-PRINCIPAL-NAME", Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"] },
                                                    {"X-MS-CLIENT-PRINCIPAL-ID", Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"]  } };

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3)作为新应用程序部署到Azure

4) 使用以下选项启用 Azure 身份验证:

  • 请求未经身份验证时要采取的操作:使用 Azure Active Directory 登录。
  • Azure Active Directory 配置:快速模式

5) 打开https://[site_name].azurewebsites.net/api/AuthDetails

6) 您将被重定向到登录页面

7) 登录成功后,您将得到响应:

{"X-MS-CLIENT-PRINCIPAL-NAME":"your_user@your_domain","X-MS-CLIENT-PRINCIPAL-ID":"your_user_ad_guid"}
Run Code Online (Sandbox Code Playgroud)