【问题标题】:Asp.Net Identity Renewal messing with LogoutAsp.Net 身份更新与注销混淆
【发布时间】:2021-06-08 03:51:54
【问题描述】:

情况
我必须处理使用 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-Operation 不再起作用。看看实现的 ms 源代码,我想,我明白了,为什么会这样,我可以完美地忍受它。

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

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

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

【问题讨论】:

    标签: asp.net asp.net-identity ws-federation


    【解决方案1】:

    再摸索一番后,我意识到,WS Federation 中间件有自己的AuthenticationType,名为“Federation”,在退出时查看IAuthenticationManager.AuthenticationResponseGrant 实例时不可见。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2016-01-28
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多