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 中的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 中
【讨论】:
挽救了我的生命和许多几乎被浪费的时间......谢谢!! 在我的例子中是<remove name="FormsAuthentication" />
为什么没有标记为正确答案?也救了我的命:)
时间!!!它永远消失了。准确地说是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]的主要内容,如果未能解决你的问题,请参考以下文章