繁体   English   中英

获得“身份验证失败。 System.InvalidOperationException”错误间歇性地与Web方法的jquery调用

[英]Getting “Authentication failed. System.InvalidOperationException” error intermittently with jquery call to Webmethod

我在ASP.NET Webform中有一个WebMethod,位于foo.aspx页面后面的代码中

    [WebMethod]
    public static String foo()
    {
       return "";
    }

我使用jQuery调用它

        $.ajax({
            type: "POST",
            url: '<%= ResolveUrl("foo.aspx/foo")%>',
            data: JSON.stringify(dataToServer),
            contentType: "application/json; charset=utf-8",
            success: function (data ) {
                 // work with data here
            }
        });

这是服务器的响应头

Request   
Request Method:POST
Status Code:401 Unauthorized
2:2
Cache-Control:private
Content-Length:105
Content-Type:application/json; charset=utf-8
Date:Tue, 20 Jan 2015 04:40:36 GMT
jsonerror:true
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET

反应体

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

背景资料

  • 我不使用ASP.NET友好URL,所以请不要建议我将AutoRedirectMode = Off设置为Off。
  • 我确实在自己的网站上使用WebApi,不确定是否与此相关。 这是我的路由配置

      RouteTable.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{name}" ); RouteTable.Routes.MapHttpRoute( name: "DefaultApiNoParameter", routeTemplate: "api/{controller}/{action}" ); 
  • 我构建的网站作为另一个ASP.NET应用程序中的子应用程序托管。 因此,我们将其称为应用程序栏,它托管在foobar中,位于域foo.com上,因此为http://foo.com/foobar/bar 有时,经过多次刷新,浏览器会弹出“站点http://foo.com:80需要您输入密码等等……”。 所有站点都启用了匿名身份验证和表单身份验证,其他身份验证均已禁用。

  • 这是我的web.config身份验证设置,其思想是该应用程序是公共的,只有foo.aspx是私有的并且受密码保护。

     <authentication mode="Forms"> <forms name="cookie" loginUrl="login.aspx" defaultUrl="foo.aspx"> <credentials passwordFormat="SHA1"> <user name="foo" password="xxxxxxxx"/> <user name="bar" password="xxxxxxxxx"/> </credentials> </forms> </authentication> 

  • 该应用程序在具有单个Web服务器的测试环境中运行良好。 仅当部署到Web场时,此问题才会发生。

  • 该错误间歇性地发生,有时一个请求起作用,有时却没有。 刷新页面几次后,我将自动注销。

该应用程序在具有单个Web服务器的测试环境中运行良好。 仅当部署到Web场时,此问题才会发生。

当加密/解密密钥在所有实例中都不匹配时,通常会发生这种情况

如果您使用SHA1来哈希密码,则需要确保网站的所有实例共享相同的machineKey以便哈希算法可以正确地哈希密码。

您可以通过将相应的密钥添加到web.config文件中来实现,例如...

<machineKey decryption="AES" 
            validation="SHA1" 
            decryptionKey="22B83C3D43B0BA0E2" 
            validationKey="1C059088E7E510C83650449D8D6567B2" />

如与...key ...相关的machineKey元素的MSDN文档中引用的内容

指定手动分配的密钥。 必须手动将此值设置为十六进制字符的字符串,以确保整个Web场中的配置一致。 使用DES加密时,密钥的长度应为16个十六进制字符;使用三重DES(3DES)或AES加密时,密钥的长度应为48个十六进制字符。 如果使用的密钥短于最大长度,则应通过真正随机的方式(例如,使用RNGCryptoServiceProvider类)来创建密钥。 ASP.NET只能在具有128位加密的计算机上使用Triple DES。

有关信息,请参见MSDN。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM