我正在学习ASP.NET MVC3,我现在正在研究用户处理。 我的第一个问题是(我知道在其他主题中有很多关于这个主题的内容,我只是找不到一个很好的MVC3),我希望登录页面重定向我来自我的地方,或者我被重定向到的地方。 在PHP中,也许我会将这个url添加到查询字符串中。 但是我需要一种方法来自动地做这个,这是一个非常常见的设计模式,我想知道是否有“内置”方式来做到这一点。
最干净或最喜欢的方法是什么?
此外,当我重定向到登录页面时,这是检查和存储我重定向的网址的最佳方式吗?我会在请求对象中检查引用者并将其在URL中吐出“?redirect = protected.html”,但我甚至不确定如何正确执行此操作。
对此主题的任何建议都将不胜感激。
答案 0 :(得分:6)
MVC的工作方式与ASP.NET相同。
如果您使用表单身份验证,那么很多问题都将为您解答。
在您的网络配置中找到标有authentication="Windows"
的行,然后将其更改为Forms
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" />
</authentication>
MVC 3实际上会为您提供帐户/登录路线作为MVC 3模板项目的一部分(检查您的模型,看看您是否有一个名为AccountModel
的人。)
然后,您只需添加Authorization
即可拒绝您网站的所有用户:
<authorization>
<deny users="?"/>
</authorization>
默认情况下,这会将访问您网站的任何人发送到您的登录信息。
因此,在验证登录凭据是否正确后,将AuthCookie
设置为与ASP.NET相同:
FormsAuthentication.SetAuthCookie(userName, false);
从此表格中,您可以重定向到您想要的地方。
重定向回你来自的地方:
FormsAuthentication.RedirectFromLoginPage(userName, false);
不要忘记其他有用的陈述:
FormsAuthentication.SignOut();
如果没有身份验证,网站将不允许您在任何地方访问,直到您登录为止,因此CSS将停止工作。
我添加的位置以确保不会发生这种情况如下:
<location path="Content">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
<location path="Scripts">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
答案 1 :(得分:3)
在asp.net中,它是一个?returnUrl = ...
(1)确保你有类似
的东西<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
。
(2)在您想要保护的控制器中,在其上方添加[Authorize]
属性。
请创建新项目并选择 Internet应用程序模板,而不是清空模板,您将获得简单登录过程的示例以及更改密码。
注意:请同时阅读:http://www.asp.net/mvc/tutorials/preventing-open-redirection-attacks
示例在登录过程中显示,它确保returnUrl是Url.IsLocalUrl()帮助程序的本地URL,以防止打开重定向攻击。
<强>更新强> 在您真正了解标准流程后,最好的方法是实现自己的自定义登录流程,而不是使用URL来跟踪用户的来源,您可以设置一个新的cookie来存储returnUrl使用httponly cookie并在重定向到上一页之前将其删除。
另一种常见做法是使用角色。您可以通过将允许的角色添加为控制器上方的属性来为特定的用户组Role
指定目录/控制器:
[Authorize(Roles = "Admin")]
请参阅this visual studio 管理工具,以使用内置网络界面创建示例用户和角色。
您可能还希望使用站点地图根据当前用户角色使用显示/隐藏菜单排列您的页面和菜单链接。使用此mvcsitemap在ASP.NET MVC站点地图中添加安全修整功能。
答案 2 :(得分:0)
在某些情况下,恰好有自定义身份验证而不是基于标准表单(企业级应用程序的常见情况)。
在这种情况下,我建议手动管理查询字符串中的returnUrl
参数。登录页面会读取此URL并在成功验证后重定向回来。