根据本文档:

ASP.NET Core 2.1 Documentation

我应该能够使用 ControllerBase.User 或 HttpContext.User 访问用户身份。

根据上面的链接:

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

据我了解,我应该在 Startup.cs 或 Controller 的构造函数中使用依赖注入(inject)来注入(inject)身份信息。

然而,经过无数小时的调查,我无法找到程序。

以下步骤描述了我的场景。我希望有人能指导我朝着正确的方向前进。

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 事件目录配置:快速模式

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

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

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

    最佳答案

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

    就像那样。

    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    

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

    同样,对于 Controller 中的操作,还需要添加[授权]。仅当添加此内容时,您才可以检索详细信息。如果在 Controller 级别添加,则对于不需要身份验证的操作,可以添加[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 );
            }
    

    关于c# - 从 ASP.NET Core Web API 中的 Controller 访问用户身份,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52194465/

    10-15 09:06