Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React.js+;asp.net核心&x2B;windows集成单点登录_Reactjs_Asp.net Core_Active Directory_Authorization - Fatal编程技术网

Reactjs React.js+;asp.net核心&x2B;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

我有一个react应用程序,它将在公司网络中运行,其中必须对active directory服务器进行授权(安全组基本上是应用程序角色,它们必须控制应用程序中的权限)。应用程序的所有用户都已将windows计算机登录到域

我的想法是,为了授权工作,我只需要前端中的两个信息

  • windows用户名
  • 与用户所在的应用程序相关的安全组列表
    (安全组可能是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

    你好,穆菲利克斯。你能弄明白吗?我只是碰到了同样的问题。你能回答你的问题吗?谢谢Shello@Biggles是的,我会的。通过在IIS中启用windows身份验证(Kestrel没有此功能)解决了此问题,之后,
    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 });
         }
     }