FormsAuthentication.SetAuthCookie 在 MVC 5 中不 [Authorize]

Posted

技术标签:

【中文标题】FormsAuthentication.SetAuthCookie 在 MVC 5 中不 [Authorize]【英文标题】:FormsAuthentication.SetAuthCookie doesn't [Authorize] in MVC 5 【发布时间】:2014-12-24 03:47:35 【问题描述】:

我创建了一个全新的 ASP.NET MVC 5 项目来使用 FormsAuthentication.SetAuthCookie 测试 [Authorize] 属性。我只是在一个操作中设置了一个 cookie(在我的 Home 控制器中):

    public ActionResult About()
    
        FormsAuthentication.SetAuthCookie("someUser", false);

我限制访问另一个:

    [Authorize]
    public ActionResult Contact()
    

当我启动网页并导航到 /home/contact 时,我被正确重定向到登录页面。然后我去/home/about,拿到我的cookie,然后回到联系页面。但我仍然被重定向到登录页面——cookie 没有对我进行身份验证/授权。

在调试器中,HttpContext.User.Identity.IsAuthenticated == false 当我多次加载“关于”页面时(也就是说,即使设置了身份验证 cookie,它也不会认为我已通过身份验证。

这里是否有一些额外的步骤必须完成?我不需要为基本身份验证设置自己的 IPrincipal,是吗?

【问题讨论】:

MVC5 不再使用表单身份验证,请检查您的 web.config 中的 。如果你想按照这篇文章使用它,你可以使用 owin 来处理它。 blogs.msdn.com/b/webdev/archive/2013/07/03/… 在对 OWIN 进行了一些研究之后,这似乎是更好的选择,看看微软如何在 MVC 6 的这个方向上前进。我以ASP.NET Identity Without A Database 为例说明如何进行身份验证和授权。它比简单的SetAuthCookie 复杂得多,但它似乎更具前瞻性。 伙计,那是一堆嘟嘟。微软为什么要这么做? @DSR ,我在 web.config 中找不到 <modules> <remove name="FormsAuthentication" /> </modules> 【参考方案1】:

编辑:我不知道 MVC5 将新项目默认为删除表单身份验证(模块已删除),因此请确保您同时检查原始帖子下的 DSR 评论。

检查您的 web.config 并查找身份验证部分,它应该看起来像这样,

<authentication mode="Forms">
  <forms loginUrl="..." cookieless="UseCookies" />
</authentication>

http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.85%29.aspx

默认的 cookieless 值为“UseDeviceProfile”,这意味着如果浏览器报告它支持 cookie,则使用 cookie,否则不使用 cookie,它使用查询字符串中的值来维护经过身份验证的状态(需要在整个回发)。

其次,确保在您的浏览器中启用 cookie。如果设备/浏览器不支持 cookie 或它们已关闭,则 SetAuthCookie 将对 url 进行更改,但您必须在调用 SetAuthCookie 后重定向浏览器使用...

FormsAuthentication.RedirectFromLoginPage(String, Boolean)...

该方法在使用 SetAuthCookie 进行身份验证后将页面重定向到其目的地。 RedirectFromLoginPage 会将所需的属性放在 url 查询中,以维护跨回发的登录会话。如果您在此处和那里的站点上进行自己的重定向,则需要通过检查当前用户是否通过 HttpContext.Current.User.Identity.IsAuthenticated 进行身份验证来维护该 url 查询参数。

为了将您的用户发送到您应该使用的登录页面

FormsAuthentication.RedirectToLoginPage()

该方法将在查询字符串中添加一个returnUrl参数,稍后的函数“RedirectFromLoginPage”将在通过身份验证后重定向回。

如果您使用 web.config 中的 location 元素阻止用户或角色访问路径和资源,则当未经身份验证的用户尝试访问它们时,Forms Authentication 会自动处理重定向到登录页面。

  <location path="SomeFolderOnYourSite">
    <system.web>
      <authorization>
        <deny users="?"/>
        <allow roles="Administrators"/>
      </authorization>
    </system.web>
  </location>

【讨论】:

【参考方案2】:

从 web.config 中删除:

<modules>
  <!--<remove name="FormsAuthenticationModule" />-->
</modules>

或简单地删除该行 在 web.config 中

【讨论】:

挽救了我的生命和许多几乎被浪费的时间......谢谢!! 在我的例子中是&lt;remove name="FormsAuthentication" /&gt; 为什么没有标记为正确答案?也救了我的命:) 时间!!!它永远消失了。准确地说是8小时。我很高兴我发现这个或更多的时间已经过去了。这在 2 分钟内解决了所有问题! 当经验丰富的开发人员编写 5-7 行代码来解决问题,然后一个人默默地来破坏他们的答案时,这真是太棒了。哈哈!奇妙的解决方案。你刚刚救了我的一天。非常感谢! :)【参考方案3】:
 <location path="SomeFolderOnYourSite">
<system.web>
  <authorization>
    <deny users="?"/>
    <allow roles="Administrators"/>
  </authorization>
</system.web>

当我使用相同的代码并进行少量更改时,它对我不起作用**<location path="~/SomeFolderOnYourSite"> <system.web> <authorization> <deny users="?"/> <allow roles="Administrators"/> </authorization> </system.web> </location>**

【讨论】:

【参考方案4】:

为表单标签的domain 属性指定错误的值也会导致这种情况。

<authentication mode="Forms">
  <forms domain="localhost" ... />
</authentication>

【讨论】:

指定错误的域本身不会运行页面。会有运行时错误。

以上是关于FormsAuthentication.SetAuthCookie 在 MVC 5 中不 [Authorize]的主要内容,如果未能解决你的问题,请参考以下文章