2014-09-30 62 views
0

我有一个应用程序需要同时支持联邦(IdP启动)以及手动验证(标准的用户名/密码表单)。因此,我使用.NET v4.5 System.Identity来使应用程序声明了解。WSFederation&Manual ClaimsIdentity与AppPool回收

我们在dev中看到的问题是,无论何时发生AppPool回收(如重新编译),我们重新加载页面或采取任何其他操作时,都会尝试访问我们的任何自定义声明。这就好像用户是仍然通过验证,但我们的定制索赔完全没了。为了继续工作,我们需要关闭浏览器的所有实例并重新登录。这显然可能发生在野外,并且是我们不可能发生的事情(可怕的最终用户体验)。

我们做错了什么或者我们可以捕捉/检测这种情况并强制用户重新登录?

背景

在手动登录的情况下,我们建立一个被传递到一个新的ClaimsPrincipal然后用于创建一个新的SessionSecuirytToken实例,然后写出如下一个CustomClaimsIdentity实例:

var claims = CustomClaimsAuthenticationManager.BuildClaimsList(user); 
var identity = new UniversalIdentity(claims, AuthenticationTypes.Password); 
var principal = new ClaimsPrincipal(identity); 
var token = new SessionSecurityToken(principal, TimeSpan.FromMinutes(user.Customer.SessionExp ?? 120)); 
var sam = FederatedAuthentication.SessionAuthenticationModule; 
sam.WriteSessionTokenToCookie(token); 

在IdP启动登录的情况下,我们处理FederatedAuthentication.WSFederationAuthenticationModule.SignedIn事件,并执行检查以验证所提供的CL目标以及构建我们的应用程序添加到身份的自定义声明与我们进行手动身份验证的方式相同。

+0

我远一点缩小下来,看来,我的静态辅助类之一是试图访问'Thread.CurrentPrincipal'这是只是一个'IPrincipal',而不是'ClaimsPrincipal'。有没有办法将'Thread.CurrentPrincipal'对象变成'ClaimsPrincipal'对象? – KyKo 2014-09-30 21:35:19

回答

0

您可以放心地投了IPrincipalClaimsPrincipal

ClaimsPrincipal cp = (ClaimsPrincipal)Thread.CurrentPrincipal;