【问题标题】:Getting “Authentication failed. System.InvalidOperationException” error intermittently with jquery call to Webmethod获取“身份验证失败。 System.InvalidOperationException” 错误间歇性与 jquery 调用 Webmethod
【发布时间】:2015-01-20 06:04:13
【问题描述】:

我在 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 所以请不要建议我转 自动重定向模式 = 关闭。
  • 我确实在我的网站中使用了 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>
    

  • 该应用程序在测试环境中运行良好,具有 单一的网络服务器。只有当部署到网络场时才会出现这个问题 发生。

  • 错误间歇性发生,有时请求有效,有时无效。刷新几次页面后,我会自动退出。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    有关信息可以在MSDN找到

    【讨论】:

    • 所以如果我使用清除密码就不需要维护 machineKey 对吗?
    • @Quannt 不,如果将其配置为纯文本,则不会,但仅用于此功能。在部署到 Web 场和负载平衡的基础架构时,指定 machineKey 元素始终是一个好习惯,因为 ASP.NET 中还有其他功能需要执行基本的加密和加密操作,例如,视图状态使用加密进行加密键
    • 谢谢@Leo!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2022-10-20
    • 2020-10-13
    • 2018-11-11
    • 2022-12-18
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多