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

时间:2018-09-05 23:08:43

标签: c# azure asp.net-web-api asp.net-core

根据此文档:

ASP.NET Core 2.1 Documentation

我应该能够使用 ControllerBase.User HttpContext.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 );
        }

    }
}

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":[]}

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

您必须告诉您在startup.cs中需要使用的身份验证。

就像那样。

services.AddAuthentication(IISDefaults.AuthenticationScheme);

此详细信息的链接可以在this上找到。

在控制器中的动作上,还需要添加[授权]。只有添加了此选项,您才能检索详细信息。如果在控制器级别添加,则对于不需要身份验证的操作,可以添加[AllowAnonymous]

[HttpGet]
[Authorize]
        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 );
        }

答案 1 :(得分:0)

此示例有效:

https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2

我可以使用以下命令在控制器内识别用户

User.FindAll("preferred_username").First().Value;

这是另一种项目类型。这是一个MVC网站,而不是API项目。

这并不是我一直在寻找的东西,但至少它能起作用。 我将研究如何将此应用于我的API项目。

答案 2 :(得分:0)

我做到了!

这个documentation为我指明了正确的方向。

这些是重现我的方案的步骤:

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"]  } };

        }
    }
}

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"}