获得“身份验证失败。 System.InvalidOperationException“间歇性地使用jquery调用Webmethod时出错

时间:2015-01-20 06:04:14

标签: c# jquery asp.net forms-authentication asp.net-web-api2

我在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。
  • 我在我的网站上使用WebApi,不知道是否 与此相关。这是我的路由配置

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

  • 这是我的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场时才出现此问题 发生的情况。

  • 错误是间歇性发生的,有时是请求有效,有时它不会。刷新页面几次后,我将自动注销。

1 个答案:

答案 0 :(得分:1)

  

应用程序在单个Web服务器的测试环境中运行良好。只有在部署到Web场时才会出现此问题。

这通常发生在加密/解密密钥不匹配所有实例

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

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

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

在与machineKey值相关的...key元素的MSDN文档中引用...

  

指定手动分配的密钥。必须手动将此值设置为   一串十六进制字符,以确保一致的配置   跨Web场。密钥应为16个十六进制字符   使用DES加密时的长度和48个十六进制字符   使用Triple DES(3DES)或AES加密时的长度。如果键更短   使用的最大长度,应由a创建   真正随机的方法,例如使用RNGCryptoServiceProvider   类。 ASP.NET只能在128位的计算机上使用Triple DES   加密可用。

有关信息,请参阅MSDN