ASP.NET MVC - 如何处理过期的密码?

Tom*_*idd 9 authentication asp.net-mvc

在ASP.NET MVC应用程序中处理过期密码的最佳方法是什么?

让我解释一下 - ASP.NET MVC显然已经设置(在nerdDinner示例的准系统应用程序中)来处理以下场景:

  • 注册新用户
  • 允许他们更改密码
  • 使用有效的帐户/密码登录

它没有的是一个非常好的方法来做到以下几点:

  • 强制用户在密码过期时更改密码

ASP.NET MVC的思维方式指向让用户转到单独的URL /视图以执行密码更改的想法.

这个想法的问题是,如果他们没有登录,我不希望人们能够访问此URL,并且我不希望他们能够使用过期密码访问网站中的任何其他位置.

在过去,我处理这个问题的方法是让用户不要离开登录页面并让ASP.NET面板显示"哦,你需要更改密码"位,并隐藏页面的其余部分.此时用户尚未登录,因此他们将不会进行身份验证,并且在更改密码之前无法访问任何位置.

但ASP.NET MVC使这很困难.如果我喜欢上面的内容并且在登录页面上包含所有内容,那么我必须进行非常繁琐的Login()操作才能处理所有可能的发布值.如果我将其发布到另一个操作/视图,那么我冒着必须登录用户或更改密码页面不受身份验证保护的风险(因为,与您提供的"更改密码"位不同,我不希望他们在看到页面时进行身份验证).

我可以设想一些场景,你可以在ViewData中设置一些东西来表明密码已过期,并坚持将用户重定向到"更改密码"页面,但我不确定这是否安全.

tva*_*son 6

我会考虑使用自定义(扩展现有的)AuthorizeFilter来设置AuthorizationContext上的ActionResult,以便在用户通过身份验证但密码已过期时重定向到您的更改密码操作.这将允许他们正常登录,但如果他们的密码已过期,则仅将其限制为该操作.我在我的一个应用程序中使用了类似的方法,如果他们在网站上注册但尚未注册参加活动(这是一个慈善活动管理应用程序),则会将人重定向到活动注册页面.

您甚至可以将其作为单独的过滤器实现,并仍然使用现有过滤器进行授权.

 [Authorize]
 [RequiresUnexpiredPassword]
 public class MyController : Controller
 {
     ...
 }
Run Code Online (Sandbox Code Playgroud)

当然,您必须确保允许ChangePassword操作继续进行而不会被过滤器重定向.