根据此文档:
ASP.NET Core 2.1 Documentation
我应该能够使用 ControllerBase.User 或 HttpContext.Use r访问用户身份。
根据上面的链接:
“从应用程序的DI服务集合中获取当前用户的身份也更具可测试性,因为可以轻松注入测试身份。”
据我了解,我应该使用依赖注入在 Startup.cs 或控制器的构造函数中注入身份信息。
但是,经过无休止的调查,我找不到程序。
以下步骤描述了我的情况。我希望有人可以指引我正确的方向。
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中都没有标识信息。响应与启用身份验证之前相同。
答案 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项目:
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身份验证:
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"}