我正在创建一个新的ASP.Net Core RC2 API项目,并使用JWT承载令牌 . 我在创建和使用令牌进行身份验证时没有遇到任何问题 . 我有一个Entity Framework 6 dbContext . 该上下文还与各种其他解决方案一起使用 . db上下文执行一些额外的审计日志记录,我期望自定义主体,或至少来自令牌的声明 . 我可以在http上下文中看到声明,但是稍后在构造dbContext时它们不在线程上 .
在Startup.cs中:
services.AddTransient(typeof(ApiContext), (_) => new ApiContext(Configuration["Data:SqlConnection"]));
...
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.Filters.Add(new ClaimsAuthorizationFilter());
}
);
在ClaimsAuthorizationFilter中:
ClaimsIdentity identity = context.HttpContext.User.Identity as ClaimsIdentity;
身份显示所有索赔 . 线程上的现有主体及其标识是通用的,没有声明 . 我可以使用上下文用户对象中的标识来创建新主体并将其附加到当前线程 .
var auditPrincipal = new AuditPrincipal(
identity,
new AuditUser()
{
...
}
);
System.Threading.Thread.CurrentThread.Name = "authorized";
System.Threading.Thread.CurrentPrincipal = auditPrincipal;
在dbContext构造函数中(在上面的代码之后调用),我只看到一个通用的主体,并且没有对标识的声明 . 我确实看到线程名称是我之前设置的名称 .
ClaimsIdentity identity = System.Threading.Thread.CurrentPrincipal.Identity as ClaimsIdentity;
在授权dbContext后,如何确保正确的主体/声明标识可用?