C# WSFederation&使用AppPool回收的手动索赔实体
我有一个应用程序,需要支持联合IdP启动以及手动身份验证标准用户名/密码表单。因此,我正在使用.NETV4.5System.Identity使应用程序声明能够识别 我们在dev中看到的问题是,每当AppPool循环像重新编译一样发生时,我们重新加载页面或执行任何其他操作,我们在尝试访问任何自定义声明时都会出错。就好像用户仍然经过身份验证,但我们的自定义声明已经完全消失了。为了继续工作,我们需要关闭浏览器的所有实例并再次登录。这显然可以在野外发生,这是我们无法在可怕的最终用户体验中发生的事情 我们是否有什么做错了,或者有什么方法可以捕获/检测到这种情况并强制用户重新登录 背景 在手动登录的情况下,我们构建了一个CustomClaimSideEntity实例,该实例被传递到一个新的ClaimsPrincipal中,然后用于创建一个新的SessionSecurityToken实例,然后写出如下内容:C# WSFederation&使用AppPool回收的手动索赔实体,c#,identity,claims-based-identity,ws-federation,C#,Identity,Claims Based Identity,Ws Federation,我有一个应用程序,需要支持联合IdP启动以及手动身份验证标准用户名/密码表单。因此,我正在使用.NETV4.5System.Identity使应用程序声明能够识别 我们在dev中看到的问题是,每当AppPool循环像重新编译一样发生时,我们重新加载页面或执行任何其他操作,我们在尝试访问任何自定义声明时都会出错。就好像用户仍然经过身份验证,但我们的自定义声明已经完全消失了。为了继续工作,我们需要关闭浏览器的所有实例并再次登录。这显然可以在野外发生,这是我们无法在可怕的最终用户体验中发生的事情 我们
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,并执行检查以验证提供的声明,以及建立我们的应用程序添加到身份中的自定义声明,方法与手动验证相同。您可以安全地将IPrincipal强制转换为ClaimsPrincipal:
我进一步缩小了范围,似乎我的一个静态助手类正在尝试访问Thread.CurrentPrincipal,它只是一个IPrincipal,而不是ClaimsPrincipal。有没有办法将Thread.CurrentPrincipal对象变成ClaimsPrincipal?
ClaimsPrincipal cp = (ClaimsPrincipal)Thread.CurrentPrincipal;