登录后登录重定向到登录? Microsoft MVC框架

时间:2011-10-24 19:02:46

标签: asp.net-mvc-3 model-view-controller routing

当我第一次使用网址http://mysite.com/myapp访问我的网站时,我被重定向到登录页面,但returnUrl是“/ myapp”。

如何确保首次访问时重定向到登录页面,但返回URL不是登录页面本身,例如“〜/ Home / Index”。

我尝试添加routes.MapRoute,将空字符串传递给“url”参数,并且在传递给“defaults”的对象中,我将returnUrl成员的值包含为“〜/ Home / Index”,但是这不会影响任何事情。

我已经尝试创建一个默认文档,并确保对登录页面进行完全匿名访问,但这也不起作用......它总是重定向并附加登录页面本身的returnUrl,这是愚蠢的。当属性安全到位时,这似乎是路由系统的默认行为的问题。

2 个答案:

答案 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重定向到的位置。