我在我的MVC站点上有表单身份验证,并且默认路由设置为将用户发送到/ home/index。主页/索引通过Web.config位置部分从登录要求中排除。如果我输入http://Example/home/index,我会按预期转到主页,但如果我只是执行http://Example,我会重定向到登录页面。MVC上的表单身份验证总是重定向到登录
如果我关闭身份验证并执行http://Example,默认路由工作正常,并且我被发送到主页。
为什么身份验证不尊重默认路由?谢谢!
我在我的MVC站点上有表单身份验证,并且默认路由设置为将用户发送到/ home/index。主页/索引通过Web.config位置部分从登录要求中排除。如果我输入http://Example/home/index,我会按预期转到主页,但如果我只是执行http://Example,我会重定向到登录页面。MVC上的表单身份验证总是重定向到登录
如果我关闭身份验证并执行http://Example,默认路由工作正常,并且我被发送到主页。
为什么身份验证不尊重默认路由?谢谢!
您不应该在web.config
中使用<location>
元素来处理ASP.NET MVC应用程序中的授权,因为它可能会与您的路由发生冲突。这用于标准WebForms应用程序,但在MVC中被认为是不好的做法。
处理此问题的推荐方法是用[AuthorizeAttribute]
装饰您的控制器/操作。所以摆脱web.config中的所有location
元素并进行装饰。
对我来说,问题是MachineKey
。如果您正在这样做(例如:网络农场),则需要解密/加密Cookie 。由于该应用程序无法解密该cookie,即使它来回传递,该应用程序的行为就像该cookie甚至没有。增加此设置的web.config固定对我来说:
<machineKey compatibilityMode="Framework20SP2" validationKey="some_hard_coded_long_key" decryptionKey="another_hard_coded_long_key" validation="SHA1" />
请参阅本文更多的machinekey。
是的,这似乎是一个可行的解决方案,但除非我错过了一些东西,这似乎很乏味。有没有办法锁定一切,并提供排除,而不是必须装饰每一个控制器的行动?也许在基地控制器? – 2010-10-12 17:01:38
将您的控制器组织成功能。 'PublicController','AdminController',你得到了点,然后只修饰控制器。你也可以使用一个基础控制器。通过这种方式,所有属性将应用于此控制器上的所有操作。 – 2010-10-12 17:03:12
好的,很酷。谢谢! – 2010-10-12 17:38:10