更改User-Agent标头触发表单身份验证

时间:2011-09-27 14:17:34

标签: asp.net asp.net-mvc activex

我有一个使用ASP.NET MVC 3.0构建的应用程序。它使用asp.net的内置表单身份验证,没有会话状态,浏览器上的cookie用于识别发出请求的用户。

现在,当我使用IE9测试应用程序时,典型的HTML请求会在标头中发送此用户代理,一切正常。

User-Agent:Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)

但是,我们在应用程序中有一个页面,其中包含一个在浏览器中承载Microsoft Word的ActiveX容器。此ActiveX容器的目的是允许您对word文档进行修改,单击按钮将该word文档与您对服务器的更改发布,以便保存。

ActiveX控件中有一种方法 - 来自www.ocxt.com的Office Viewer Component - 称为HttpPost(),它将查看文档的内容发布到服务器。

当你调用HttpPost()时,它会正确发送所有相同的cookie,但使用不同的User-Agent字符串。

User-Agent:Mozilla / 4.0(兼容; MSIE 5.5; Windows NT 4.0)

使用MSIE 5.5字符串的UserAgent似乎会导致ASP.NET或MVC不将请求发送到相应的控制器,而是向Login页面发送重定向响应,即使cookie对于会话是正确的。我使用Fiddler进行了测试,并尝试使用MSIE 6.0,7.0,8.0,这些似乎工作正常,因此具体来说,5.5会导致部分服务器堆栈重定向到登录页面。

这个页面以前工作正常,所以我不确定最近版本的ASP.NET / MVC中是否有变化,或者是因为我已经升级到IE9.0,但基本上,我是想知道是否有可能告诉ASP.NET在确定会话是否已经过身份验证时不考虑User-Agent。

感谢。

2 个答案:

答案 0 :(得分:6)

IIRC在ASP.NET 4.0中发生了变化,其中Forms Authentication使用用户代理来检测它是否支持cookie,如果它不是可识别或不支持的用户代理,则它根本不使用身份验证cookie。您需要更改HTTP请求的用户代理。

答案 1 :(得分:2)

如何禁用此Web服务器的默认行为,以检查web.config中用户代理的cookie支持并强制所有浏览器使用Cookie ...

<system.web>
    <authentication mode="Forms">
        <forms cookieless="UseCookies" />
    </authentication>
</system.web>

这个默认设置令人讨厌的是新浏览器上的一些有效的User-Agent标头会导致cookie被忽略。

此User-Agent的表单身份验证cookie不会被忽略...

Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3

此用户代理的表单身份验证cookie被忽略...

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; en-us) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/23.0.1271.91 Mobile/10A523 Safari/8536.25

但添加cookieless="UseCookies"属性将告诉ASP.NET使用任何内容的cookie。