根据本文档:
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 项目:
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 身份验证:
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/