ASP.NET Identity,持久性cookie - 是否内置了类似的功能?

10 浏览
0 Comments

ASP.NET Identity,持久性cookie - 是否内置了类似的功能?

我们正在使用CookieAuthenticationProvider,并希望在我们的应用程序中实现“记住我”功能,其工作原理如下:

  1. 无论是否选中“记住我”复选框,令牌过期时间始终应设置为30分钟(开启滑动过期)
  2. 如果用户未选中“记住我”,我们只需检查令牌是否过期-如果过期,则将用户重定向到登录界面(这是内置在OWIN中的,可以正常工作)
  3. 但是,如果用户选中“记住我”,则其凭据应保存在附加的cookie中(默认生命周期为30天)。如果令牌过期(超时仍然设置为30分钟),OWIN应在后台自动使用该附加cookie重新生成令牌。因此,换句话说-如果用户选中“记住我”,他应该登录30天或直到注销。

问题是-如何使用OWIN实现这样的功能?据我所见,默认实现仍然使用ExpireTimeSpan参数-唯一的区别是,cookie被标记为持久的,因此如果用户重新启动浏览器,他将保持登录状态-但是令牌的过期仍受到ExpireTimeSpan的限制。

我猜我必须在SignIn期间手动保存用户凭据,并重写OnApplyRedirect事件(如果未经授权的用户尝试访问需要授权的视图,这似乎是唯一触发的事件),并且在重定向之前,以某种方式重新生成用户的令牌...但是有人知道具体如何做吗?

0
0 Comments

ASP.NET Identity是一种用于身份验证和授权的框架。它提供了处理用户身份验证和授权的功能,包括用户注册、登录、密码重置等。

在ASP.NET Identity中,可以使用持久化cookie来记住用户的登录状态。持久化cookie是一种特殊的cookie,可以在用户关闭浏览器后仍然保持有效,以便下次用户访问时能够自动登录。

然而,在某些情况下,ASP.NET Identity中并没有内置实现持久化cookie的功能。因此,我们需要自己编写中间件来实现这个功能。

解决方法是编写一个自定义的中间件类RememberMeTokenMiddleware,其中包含了处理持久化cookie的逻辑。这个中间件需要在Startup类的ConfigureAuth方法中进行配置,通过调用app.Use()方法来启用。

在RememberMeTokenMiddleware类中,有一个Invoke方法,这个方法是中间件的核心逻辑。在该方法中,首先检查是否需要删除持久化cookie,如果需要删除,则删除相关的cookie。否则,判断用户是否已经登录,如果没有登录,则尝试使用RememberMeToken cookie来登录用户。

在CheckAndCreateRememberMeToken方法中,会进行一些逻辑判断,以确定是否需要生成RememberMeToken cookie。如果用户是通过正常登录方式登录的,并且设置了IsPersistent属性,则生成RememberMeToken cookie。

在Login方法中,会尝试从RememberMeToken cookie中获取用户的信息,并进行验证。如果验证通过,则进行登录操作,并设置用户已经通过RememberMeToken cookie登录。

在IsRememberMeTokenStillValid方法中,会对RememberMeToken的有效性进行判断。首先,检查是否存在UserId和SecurityStamp的Claims。然后,通过UserId获取用户数据,并进行一系列的验证,包括是否锁定、SecurityStamp是否一致等。

以上就是解决ASP.NET Identity中没有内置的持久化cookie功能的方法。通过编写自定义的中间件,我们可以实现持久化cookie的功能,从而提供更好的用户体验。

0