【问题标题】:Why is the [Authorize] attribute not working?为什么 [Authorize] 属性不起作用?
【发布时间】:2014-09-17 16:50:19
【问题描述】:

我有一个 ASP.NET MVC5 网站,当用户登录时,我执行以下操作...

FormsAuthentication.SetAuthCookie(customer.GetSalutation, rememberMe);

我有一个 CustomerController,用 [Authorize] 属性装饰...

[Authorize]
public class CustomerController : Controller {
  public ActionResult Ferret() {
    return View();
  }
}

...但这似乎被忽略了。如果我尝试访问 /Customer/Ferret,它允许非常愉快。

我也尝试将 [Authorize] 添加到控制器方法中,但这没有任何区别。

我做错了什么?

【问题讨论】:

  • 您登录应用了吗?如果是这样,请退出并重试。

标签: asp.net asp.net-mvc authentication


【解决方案1】:

更新 - 发现问题!

我意识到情况并不像我描述的那样。如果我退出并尝试访问 /Customer/Ferret,我会按预期被发送到登录页面。

我有一个静态类 LoggedInUser,其中包含一个名为 Me 的属性,其中包含有关登录用户的信息。

当我上传网站的新版本时出现了问题(目前这种情况发生得很多,因为我们每天都在积极开发和推出新版本数次)。如果有人登录,并且我更新了站点,则该站点将被重新编译。他们的身份验证 cookie 没有被删除,因为他们没有注销,但是当他们尝试访问该页面时,身份验证信息不存在,所以我在 LoggedInuser 类上得到一个空引用异常。

我将以下内容添加到 Global.asax 并解决了问题...

protected void Application_BeginRequest() {
  if (LoggedInUser.Me == null || LoggedInUser.Me.LgID == 0) {
    FormsAuthentication.SignOut();
  }
}

成功了。如果他们在重新编译后尝试访问页面,LoggedInUser.Me 将为 null(或 LgID 为零)并且他们将被注销,这会将他们发送到登录页面。

不知道这是否会帮助任何人,但我会发布它以防万一。

【讨论】:

    【解决方案2】:

    确保在用户退出时删除设置的 cookie。如果还在,则认为用户已登录并通过授权。

    在您退出活动时致电FormsAuthentication.SignOut();。

    【讨论】:

    • 谢谢,但不是这样。我正在删除 cookie,如果我正常注销,我将无法访问该页面。我刚刚意识到如果我上传新版本的站点(或在 VS 中启动新的调试会话)会出现问题,这会导致重新编译站点。 cookie 没有被删除,因为用户没有注销,但我仍然可以访问授权页面。任何想法如何解决这个问题?我将更新问题以澄清这一点。谢谢
    • 在更新问题时,我想出了如何解决它。还是谢谢
    猜你喜欢
    • 2020-11-21
    • 2019-02-19
    • 2017-02-16
    • 1970-01-01
    • 2021-04-27
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多