Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WSFederation&使用AppPool回收的手动索赔实体_C#_Identity_Claims Based Identity_Ws Federation - Fatal编程技术网

C# WSFederation&使用AppPool回收的手动索赔实体

C# WSFederation&使用AppPool回收的手动索赔实体,c#,identity,claims-based-identity,ws-federation,C#,Identity,Claims Based Identity,Ws Federation,我有一个应用程序,需要支持联合IdP启动以及手动身份验证标准用户名/密码表单。因此,我正在使用.NETV4.5System.Identity使应用程序声明能够识别 我们在dev中看到的问题是,每当AppPool循环像重新编译一样发生时,我们重新加载页面或执行任何其他操作,我们在尝试访问任何自定义声明时都会出错。就好像用户仍然经过身份验证,但我们的自定义声明已经完全消失了。为了继续工作,我们需要关闭浏览器的所有实例并再次登录。这显然可以在野外发生,这是我们无法在可怕的最终用户体验中发生的事情 我们

我有一个应用程序,需要支持联合IdP启动以及手动身份验证标准用户名/密码表单。因此,我正在使用.NETV4.5System.Identity使应用程序声明能够识别

我们在dev中看到的问题是,每当AppPool循环像重新编译一样发生时,我们重新加载页面或执行任何其他操作,我们在尝试访问任何自定义声明时都会出错。就好像用户仍然经过身份验证,但我们的自定义声明已经完全消失了。为了继续工作,我们需要关闭浏览器的所有实例并再次登录。这显然可以在野外发生,这是我们无法在可怕的最终用户体验中发生的事情

我们是否有什么做错了,或者有什么方法可以捕获/检测到这种情况并强制用户重新登录

背景

在手动登录的情况下,我们构建了一个CustomClaimSideEntity实例,该实例被传递到一个新的ClaimsPrincipal中,然后用于创建一个新的SessionSecurityToken实例,然后写出如下内容:

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;