我已在Intranet ASP.NET Core 1.0 Web App中成功实施了Windows身份验证,并且我的控制器中的User.Identity.Name
以DOMAIN\user
的形式提供了用户名。我也在使用Entity Framework Core。
我想要做的是从我的SQL Server数据库获取此DOMAIN\user
的额外用户信息,并以全局方式存储。我可以在每个控制器操作上通过HttpContext.Session
设置和检查cookie值,但我更喜欢全局方法。我怎么能这样做?
答案 0 :(得分:1)
我们通过使用claims和middleware“为”登录用户“丰富”每个请求的其他信息来实现此目的。为了记录,我们正在使用cookie身份验证,但我认为这不重要。
这是我们的方法:
让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);
}
}
您决定如何获取其他信息非常取决于您。
在我们的例子中,System.Security.Claims.ClaimTypes.NameIdentifier
只是一个GUID,用于标识数据库中的一行,此行包含基本信息,如名字,姓氏,地址和电子邮件,我们将其作为索赔集合返回。
interface IMyClaimProvider
{
IEnumerable<Claim> GetNonPersistentClaims(string nameIdentifier);
}
在应用程序启动时注册中间件。 中间件的顺序很重要! 我们的自定义中间件必须在用于身份验证的中间件之后注册。
public void Configure(IHostingEnvironment environment, IApplicationBuilder application, ILoggerFactory loggerfactory)
{
application.UseIISPlatformHandler();
application.UseStaticFiles();
[...]
application.UseMiddleware<UserClaimsMiddleware>();
[...]
}
答案 1 :(得分:0)