经过身份验证后如何全局设置我的用户信息

时间:2016-04-12 17:23:42

标签: asp.net-core windows-authentication ssrs-2008-r2

我已在Intranet ASP.NET Core 1.0 Web App中成功实施了Windows身份验证,并且我的控制器中的User.Identity.NameDOMAIN\user的形式提供了用户名。我也在使用Entity Framework Core。

我想要做的是从我的SQL Server数据库获取此DOMAIN\user的额外用户信息,并以全局方式存储。我可以在每个控制器操作上通过HttpContext.Session设置和检查cookie值,但我更喜欢全局方法。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我们通过使用claimsmiddleware“为”登录用户“丰富”每个请求的其他信息来实现此目的。为了记录,我们正在使用cookie身份验证,但我认为这不重要。

这是我们的方法:

  1. 创建一个middleware类,它将作为获取非持久claims的入口点,即我们不想存储在我们的cookie中的声明,以及在您的情况下声称不存在的声明通过Windows身份验证自动初始化。
  2. middleware获取一些额外信息,并根据用户ID将其添加到当前用户。 在下面的示例中,我们使用各种IMyClaimProvider来为当前用户获取额外的claims

    using System.Collections.Generic;
    using System.Security.Claims;
    using System.Threading.Tasks;
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Http;
    
    class UserClaimsMiddleware
    {
        private readonly RequestDelegate _next;
    
        public UserClaimsMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task Invoke(HttpContext httpContext, IEnumerable<IMyClaimProvider> claimProviders)
        {
            foreach (var claimProvider in claimProviders)
            {
                var identity = (ClaimsIdentity) httpContext.User.Identity;
                var identifier = identity.FindFirst(ClaimTypes.NameIdentifier).Value;
                var claims = claimProvider.GetNonPersistentClaims(identifier);
                identity.AddClaims(claims);
            }
            await _next(httpContext);
        }
    }
    
  3. 您决定如何获取其他信息非常取决于您。 在我们的例子中,System.Security.Claims.ClaimTypes.NameIdentifier只是一个GUID,用于标识数据库中的一行,此行包含基本信息,如名字,姓氏,地址和电子邮件,我们将其作为索赔集合返回。

    interface IMyClaimProvider
    {
        IEnumerable<Claim> GetNonPersistentClaims(string nameIdentifier);
    }
    
  4. 在应用程序启动时注册中间件。 中间件的顺序很重要! 我们的自定义中间件必须在用于身份验证的中间件之后注册。

    public void Configure(IHostingEnvironment environment, IApplicationBuilder application, ILoggerFactory loggerfactory)
    {
        application.UseIISPlatformHandler();
        application.UseStaticFiles();
        [...]
        application.UseMiddleware<UserClaimsMiddleware>();
        [...]
    }
    

答案 1 :(得分:0)

我还没有尝试@Uli的答案,但this post的第二部分帮助我从索赔中获取了用户的全名。