在ASP.NET MVC应用程序中处理过期的密码的最佳方法是什么?
让我解释一下 - ASP.NET MVC显然已设置(在nerdDinner示例的准系统应用程序中)来处理以下场景:
它没有的是一个非常好的方法来执行以下操作:
ASP.NET MVC的思维方式指向让用户转到单独的URL /视图来执行密码更改的想法。
这个想法的问题是我不希望人们在没有登录的情况下能够访问此网址,我不希望他们能够使用过期的密码在网站中的任何地方 else 。
过去我处理此问题的方法是让用户不要离开登录页面并让ASP.NET面板显示“哦,你需要更改密码”位,并隐藏其余部分的页面。此时用户尚未登录,因此他们将不会进行身份验证,并且在更改密码之前无法进入任何位置。
但是ASP.NET MVC让这很困难。如果我喜欢上面的内容并且在登录页面上包含所有内容,那么我必须进行非常繁琐的Login()操作才能处理所有可能的发布值。如果我将其发布到另一个操作/视图,那么我冒着必须登录用户或更改密码页面不受身份验证保护的风险(因为,与您提供的“更改密码”位不同,我不希望他们在看到页面时进行身份验证。)
我可以设想一些场景,你可以在ViewData中设置一些东西来表明密码已过期,并坚持将用户重定向到“更改密码”页面,但我不确定这是否安全。
答案 0 :(得分:6)
我会考虑使用自定义(扩展现有的)AuthorizeFilter来设置AuthorizationContext上的ActionResult,以便在用户通过身份验证但密码已过期时重定向到您的更改密码操作。这将允许他们正常登录,但如果他们的密码已过期,则仅将其限制为该操作。我在我的一个应用程序中使用了类似的方法,如果他们在网站上注册但尚未注册参加活动(这是一个慈善活动管理应用程序),则会将此人重定向到活动登记页面。
您甚至可以将其作为单独的过滤器实现,并仍然使用现有过滤器进行授权。
[Authorize]
[RequiresUnexpiredPassword]
public class MyController : Controller
{
...
}
当然,您必须确保允许ChangePassword操作继续进行,而不会被过滤器重定向。
答案 1 :(得分:4)
如何创建自定义AuthorizationAttribute并重写OnAuthorization方法[示例代码:asp.net mvc Adding to the AUTHORIZE attribute]。
在该方法中,您可以检查密码是否已过期,抛出PasswordExpiredException。在基本控制器中捕获此异常,并将用户重定向到“更改密码”操作。