当我第一次使用网址http://mysite.com/myapp访问我的网站时,我被重定向到登录页面,但returnUrl是“/ myapp”。
如何确保首次访问时重定向到登录页面,但返回URL不是登录页面本身,例如“〜/ Home / Index”。
我尝试添加routes.MapRoute,将空字符串传递给“url”参数,并且在传递给“defaults”的对象中,我将returnUrl成员的值包含为“〜/ Home / Index”,但是这不会影响任何事情。
我已经尝试创建一个默认文档,并确保对登录页面进行完全匿名访问,但这也不起作用......它总是重定向并附加登录页面本身的returnUrl,这是愚蠢的。当属性安全到位时,这似乎是路由系统的默认行为的问题。
答案 0 :(得分:2)
我明白了。
用于保护页面的默认IIS安全机制(即system.web / authorization部分)在使用MVC时是无用的,因为使用MVC您不会保护实际的物理页面或路径,而是通过虚拟路径引用的控制器和操作称为“路线”。
您无需在web.config中使用一行保护所有内容,而是必须记住为要保护的每个操作(或者您希望所有操作都受到保护的每个控制器类)添加[Authorize]属性,因为默认情况下一切都可以访问这意味着您的安全性是基于代码的MVC,而不是基于web.config的,因此您无法在不重新编译的情况下更改设置。
这里的确切问题是我使用授权部分保护app根目录,并且无法为物理子路径添加例外...因为在MVC中确实没有...它全部由路由处理模块。因此,在没有例外的情况下访问root时,表单身份验证模块正在说“不,您无法访问根路径”并立即提供登录页面并将重定向添加回安全根目录。
通常,将默认路由转到Account / LogOn,没关系,因为Account / LogOn具有在returnUrl缺席的情况下重定向到Home / Index的代码。但是,在这种情况下,授权部分导致通过表单身份验证生成returnUrl,这会破坏Account / LogOn操作执行默认重定向的能力。将默认路由更改为Home / Index修复了该问题;然而,这使得浏览器的URL不正确,而当我遇到URL被指定为“../Content/image.jpg”的问题时,而不是@ Url.Content(“〜/ Content / image.jpg”)。
正如您所看到的,这是一个复杂的,多方面的问题,这是由于架构的冲突引起的。
请参阅:Problem with Authorization with IIS and MVC
和
请参阅:How do I allow all users access to one route within a website with integrated auth?
总结一下,好的建议是1:默认路由应该回家而不是登录,2:确保你让框架生成相对于应用程序root的内容URL,3:添加到登录页面的http-get动作如果Request.IsAuthenticated为true,则重定向到home,并且4:使用[Authorize]属性来保护操作方法。
答案 1 :(得分:1)
您不必修改路由以使其正常工作。对于“身份验证”所需的操作,请确保使用[Authorize]
属性进行修饰。
使用表单身份验证,这会将用户重定向到配置中指定的loginUrl:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" />
</authentication>
</system.web>
发生身份验证后,有关原始页面的信息将使用RETURNURL
作为密钥放置在查询字符串中。
编辑: 在/ myapp控制器的操作结果中,检查用户是否通过Request.IsAuthenticated进行了身份验证。如果经过身份验证且返回网址为“/ myapp”(可能不需要进行第二次检查),则redirect将其移至所需的控制器/操作。
EDIT2: 默认控制器/操作在global.asax中指定。例如:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这应该是您使用RedirectToRouteResult重定向到的位置。