【问题标题】:Verify User Data Before Every Action在每次操作之前验证用户数据
【发布时间】:2009-08-26 22:01:17
【问题描述】:

我有一个用户模型,要求用户每三个月更改一次密码。我需要以某种方式检查用户是否已登录(我们允许在网站的某些部分使用匿名浏览器),如果他们的密码已过期,请强制他们输入新密码,然后才能执行其他操作。

执行此操作的蛮力方法是为每个操作添加一点代码(Account 中的 ChangePassword 操作除外)。例如:

var authenticatedUser = GetAuthenticatedUser();
if (authenticatedUser != null && authenticatedUser.IsPasswordExpired)
    return RedirectToAction("Account", "ChangePassword");

显然,这是解决此问题的一种可怕方法,但我不确定正确的方法是什么。有任何想法吗?我很确定将来我们将不得不添加更多这样的用户数据检查,所以我现在真的很想找到一个好的解决方案。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我在我的基本控制器类中进行自定义身份验证(我的所有控制器都由此派生)。您可以覆盖受保护的 Controller.OnAuthorization 方法。注意 OnAuthorization 是在 Controller.Initialize 方法之后调用的,所以如果你在 Initialize 方法中加入了其他自定义逻辑,请记住这是首先调用的。

        /// <summary>
        /// Called when authorization occurs.
        /// </summary>
        /// <param name="filterContext">Contains information about the current request and action.</param>
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            // Do custom authentication here.
            Authenticate();
    
            base.OnAuthorization(filterContext);
        }
    

    【讨论】:

    • 这看起来是个不错的解决方案。不幸的是,我将离开我的电脑几天,无法试用。一个快速的问题 - 即使操作没有使用 Authorize 属性,是否总是调用 OnAuthorize?
    • 是的,它总是会被调用。
    • 你们知道为什么这不会在直接页面点击中被调用吗?
    【解决方案2】:

    您可以编写自己的 HttpModule 并在每个请求上验证一次。 您可以从 HttpModule 派生并将其粘贴在 web.config httpModules 配置部分。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2012-08-13
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多