2014-10-28 58 views
18

我创建了一个全新的ASP.NET MVC 5项目,FormsAuthentication.SetAuthCookie测试[Authorize]属性。我简单地设置一个cookie中的一个动作(在我的家庭控制器):FormsAuthentication.SetAuthCookie不[授权]在MVC 5

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

我限制进入另一个:

[Authorize] 
    public ActionResult Contact() 
    { 

当我启动我的网页,并导航到/home/contact,我是正确的重定向到登录页面。然后我去/home/about,拿到我的cookie,然后回到联系页面。但我仍然被重定向到登录页面 - 该cookie不认证/授权我。

在调试器中,当我多次加载关于页面时(也就是说,即使在设置auth cookie之后,它从来没有认为我已经被认证),它就是HttpContext.User.Identity.IsAuthenticated == false

是否有必须在这里做了一些额外的步骤?我不应该为自己的基本身份验证设置自己的IPrincipal,是吗?

+5

MVC5不再使用表单身份验证,请检查您的web.config中的 。如果你想使用它,请按照这篇文章,你可以使用owin来处理它。 http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx – DSR 2014-10-28 16:37:54

+1

经过对OWIN的一些研究,似乎这是更好的选项,看看微软如何朝着MVC 6的方向前进。我使用[无数据库的ASP.NET身份](https://github.com/leeenglestone/ASP.NET-Identity-Without-a-Database)作为一个如何验证和授权的例子。这比一个简单的'SetAuthCookie'复杂得多,但它似乎更具前瞻性。 – user655321 2014-10-29 16:49:03

+1

男人,这是一堆doo doo。为什么微软会这么做? – Hill 2016-02-04 06:33:39

回答

9

编辑:我不知道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

默认cookie的值是“UseDeviceProfile”,这意味着,Cookie是如果使用浏览器报告它支持饼干,否则不使用Cookie和它使用在查询字符串值维持认证状态(其需要保留翻过回发)。

其次,确保cookies在你的浏览器。如果该设备/浏览器不支持cookie或者被关闭,然后将SetAuthCookie更改网址,但你必须将呼叫重定向到使用SetAuthCookie后的浏览器...

FormsAuthentication.RedirectFromLoginPage(String, Boolean)... 

这种方法重定向页面到使用SetAuthCookie进行身份验证后的目标。 RedirectFromLoginPage将在url查询中放入必要的属性,以保持跨回发的登录会话。如果你在网站上自己的重定向在这里和那里,你将需要如果当前用户与HttpContext.Current.User.Identity.IsAuthenticated认证检查,以保持该网址查询参数翻过回传你的自我。

为了用户发送到登录页面,你应该使用

FormsAuthentication.RedirectToLoginPage() 

这种方法会RETURNURL参数添加到查询字符串,其后来的功能“RedirectFromLoginPage”将被后回重定向到认证。

如果你阻止访问用户或角色与位置的元素在你的web.config路径和资源窗体身份验证自动处理重定向到登录页面,当一个没有认证的用户尝试访问它们。

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

从web.config中删除:

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

或simples删除线 在web.config中

+4

拯救了我的生命和几乎浪费了几个小时......谢谢! – Flea 2016-01-30 22:05:01

+4

在我的情况下,这是'' – Keith 2016-03-14 21:20:02

+2

为什么这不被标记为正确答案?保存我的生活:) – Koshera 2016-04-28 21:27:43

0
<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>**