在Pluralsight上看过Dominick Baier的视频,其中大部分都来自那里。我试图在.net 4.5,MVC中进行声明转换。经过大量的搞乱后,我可以改变声明,但不能让它们坚持下去。如果我只是让它每次都没有问题就运行我的ClaimsTransformer,但这是一个数据库,所以我想缓存它们。
所以这就是我做的事情
class ClaimsTransformer : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
ClaimsPrincipal transformedPrincipal = incomingPrincipal;
然后,我执行一些数据库访问,向convertedPrincipal添加新的声明。然后创建一个新的主体(可能不需要这个额外的实例化,但其他人似乎这样做),写出来:
ClaimsPrincipal newClaimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(transformedPrincipal.Claims, "ApplicationCookie"));
if (HttpContext.Current != null)
{
// this caches the transformed claims
var sessionToken = new SessionSecurityToken(newClaimsPrincipal, TimeSpan.FromHours(8));
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
}
return newClaimsPrincipal;
我可以在newClaimsPrincipal中看到新的声明。为了强制转换被调用,我正在使用来自ThinkTecture人员的ClaimsTransformationHttpModule,并且可以验证此代码是否已运行:
context.User = transformedPrincipal;
HttpContext.Current.User = transformedPrincipal;
Thread.CurrentPrincipal = transformedPrincipal;
我的其他声明是转化原则的一部分。
看起来很好 - 但是当后来的请求进来时,我没有额外的声明。如预期的那样,不会调用ClaimsTransformer,但我只有一组初始声明 - 而不是我的转换添加的声明。
退出后,我的其他声明仍然存在。这是使用带有Identity 2.0etc的新Visual Studio 2013基本MVC模板。
我认为正在发生的是登录首先运行:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
这将在我的声明被转换之前写入身份验证cookie。在此之后,我的claimtrnsformer运行并编写自己的授权cookie,所以现在我有两个。当我退出时,第一个人的索赔丢失了,而不是第二个人的索赔变得活跃。
很困惑。
由于 射线
答案 0 :(得分:2)
看起来你正在混合这两种架构。
当您使用OWIN时,确实不要以这种方式使用WIF。
这应该澄清/解决你的一半问题。现在你仍然需要在OWIN中使用ClaimsTransform。有些过滤器应该这样做,然后将其保存在OWIN身份Cookie中(我自己还没有完成)。