Reactjs React.js+;asp.net核心&x2B;windows集成单点登录
我有一个react应用程序,它将在公司网络中运行,其中必须对active directory服务器进行授权(安全组基本上是应用程序角色,它们必须控制应用程序中的权限)。应用程序的所有用户都已将windows计算机登录到域 我的想法是,为了授权工作,我只需要前端中的两个信息Reactjs React.js+;asp.net核心&x2B;windows集成单点登录,reactjs,asp.net-core,active-directory,authorization,Reactjs,Asp.net Core,Active Directory,Authorization,我有一个react应用程序,它将在公司网络中运行,其中必须对active directory服务器进行授权(安全组基本上是应用程序角色,它们必须控制应用程序中的权限)。应用程序的所有用户都已将windows计算机登录到域 我的想法是,为了授权工作,我只需要前端中的两个信息 windows用户名 与用户所在的应用程序相关的安全组列表 (安全组可能是admin、user、reporter、controller等,而user可能是其中的多个) 现在,我正在尝试创建自定义的AuthorizationSe
(安全组可能是admin、user、reporter、controller等,而user可能是其中的多个)
AuthorizationService
,其想法是从httpContextAccessor
读取windows用户名,当我拥有用户名时,我可以自由地查询active directory以获取有关安全组的信息。这种技术还允许我为测试和调试目的伪造用户名和角色组合
但我面临的问题是如何从httpContextAccessor
获取这些信息
我的实际代码
React App.js
在安装主react组件之前,我想从API获取用户名和角色列表,并将其存储在会话或存储器中,以便每个组件都可以读取它并在需要时处理授权。(关于同步和异步问题,我将在稍后处理)
startup.cs
我在启动时添加了windows身份验证(我认为这些设置应该将用户信息包括在access上下文访问器中,但我不确定)
AuthController
public class AuthController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
public AuthController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
[Route("api/auth/sso")]
public IActionResult Index()
{
// Get ClaimsPrincipal username
// var user = this.User.Identity.Name; // => return null
var username = _httpContextAccessor.HttpContext.User.Identity.Name; // => return null
var roles = new List<string>() { "admin", "user" };
return Json(new { username, roles });
}
}
公共类AuthController:Controller
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共AuthController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
[路由(“api/auth/sso”)]
公共IActionResult索引()
{
//获取ClaimsPrincipal用户名
//var user=this.user.Identity.Name;//=>返回null
var username=\u httpContextAccessor.HttpContext.User.Identity.Name;//=>返回null
var roles=new List(){“admin”,“user”};
返回Json(新的{username,roles});
}
}
当我运行应用程序时,会触发/api/auth/sso
,因此我知道我的react代码工作,但在AuthController
中,我无法从\u httpContextAccessor
检索windows用户名,因为Identity.Name
为空,因此我无法开始查询active directory:/
- 我错过了什么李>
- 此要求的良好实践是什么
- 这是一个好方法还是我必须研究一些不同的方法 方法,比如IdentityServer和JWT
HttpContext
可用于auth.Hello Muflix。你能弄明白吗?我只是碰到了同样的问题。你能回答你的问题吗?谢谢Shello@Biggles是的,我会的。通过在IIS中启用windows身份验证(Kestrel没有此功能)解决了此问题,之后可以使用HttpContext
进行身份验证。
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor(); // => added
services.AddAuthentication(IISDefaults.AuthenticationScheme); // => added
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseAuthentication(); // => added
public class AuthController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor;
public AuthController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
[Route("api/auth/sso")]
public IActionResult Index()
{
// Get ClaimsPrincipal username
// var user = this.User.Identity.Name; // => return null
var username = _httpContextAccessor.HttpContext.User.Identity.Name; // => return null
var roles = new List<string>() { "admin", "user" };
return Json(new { username, roles });
}
}