WSFederation&;手动声明与AppPool的标识回收

本文关键字:AppPool 标识 声明 amp WSFederation | 更新日期: 2023-09-27 18:25:18

我有一个应用程序,它需要支持联合身份验证(IdP Initiated)和手动身份验证(标准用户名/密码形式)。因此,我使用.NET v4.5 System.Identity来使应用程序声明知晓。

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

我们是否做错了什么,或者我们可以捕获/检测这种情况并迫使用户再次登录

背景

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

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 Initiated登录的情况下,我们处理FederatedAuthentication.WSFederationAuthenticationModule.SignedIn事件,并执行检查以验证提供的声明,以及建立我们的应用程序添加到身份的自定义声明,方法与手动验证相同。

WSFederation&;手动声明与AppPool的标识回收

您可以安全地将IPrincipal强制转换为ClaimsPrincipal:

ClaimsPrincipal cp = (ClaimsPrincipal)Thread.CurrentPrincipal;