Asp.Net Identity Renewal 干扰注销

Asp.Net Identity Renewal messing with Logout

情况
我必须处理使用 ASP.Net Identity (2.2.3) 的 MVC5 应用程序。在 CookieAuthenticationProviderOnValidateIdentity 回调中,我不时检查(时间跨度是可配置的)用户的配置是否已更改,因此用户的身份(IIdentity)必须是更新。为了将更新后的身份(及其更改后的声明)写回用户的 cookie,我在 IAuthenticationManager 上调用 SignIn 并为其提供更新后的身份:

context.OwinContext.Authentication.SignIn(context.Properties, refreshedIdentity);

问题
一般来说,这很好用。但是,如果用户试图在同样用于更新身份的请求中注销,它会搞乱注销。

当使用简单的基于密码的 cookie 身份验证时,结果是,我必须在注销操作中调用 IAuthenticationManager.SignOut 操作,提供如下显式身份验证类型:

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie)

无参数SignOut-操作不再有效。查看实现的 ms 源代码,我想,我理解,这是为什么,我可以完美地接受它。

但是,如果我通过 IAppBuilder.UseWsFederationAuthentication() (Microsoft.Owin.Security.WsFederation 4.1.1) 激活了 WS Federation,则副作用会严重得多。每个尝试注销用户并在同一请求中更新身份(更新发生在注销之前)的请求都会导致 IDP 上的注销用户,但是,a 仍然已签名在本地系统的用户中。我还没有找到规避这种行为的方法。
作为附加信息,如果描述的星座发生,ResponseSignOut 及其回调也永远不会在 CookieAuthenticationProvider 上调用。

我尝试了各种其他方法来更新身份及其声明(例如,之前调用 SignOut、使用 ReplaceIdentity 等),但是我没有找到任何可行的方法。在互联网上搜索,似乎普遍认为通过 IAuthenticationManager.SignIn 重新登录是更新用户 cookie 中身份信息的方法。

有没有人遇到过同样的问题并找到了解决方案,或者有任何想法,如何防止这种对 ws 联合(或一般)的副作用发生?

经过更多探索,我意识到 WS Federation 中间件有自己的 AuthenticationType,它被命名为“Federation”,在查看 IAuthenticationManager.AuthenticationResponseGrant 实例时是不可见的注销时。

SignOut 中提供“Federation”文字作为身份验证类型之一或将显式 AuthenticationType 分配给联合中间件后,注销按预期工作:

AuthenticationManager.SignOut([other authentication types],"Federation");

直到现在我还没有使用的是无参数 SignOut。由于我在 AuthenticationResponseGrant 中看不到联合会的身份验证类型,因此我无法编写扩展程序或一些其他通用代码,每次都可靠地退出,而无需提供至少一个 AuthenticationType SignOut 的参数值。