使用 jQuery AJAX“401(未经授权)”的 ASP.NET 调用 WebMethod

Posted

技术标签:

【中文标题】使用 jQuery AJAX“401(未经授权)”的 ASP.NET 调用 WebMethod【英文标题】:ASP.NET Calling WebMethod with jQuery AJAX "401 (Unauthorized)" 【发布时间】:2014-05-26 20:23:59 【问题描述】:

坚持了好几个小时

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

我正在尝试在我的 ASP.Net Webform 中调用此 WebMethod

[WebMethod]
public static string GetClients(string searchTerm, int pageIndex)

    string query = "[GetClients_Pager]";
    SqlCommand cmd = new SqlCommand(query);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@SearchTerm", searchTerm);
    cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
    cmd.Parameters.AddWithValue("@PageSize", PageSize);
    cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
    return GetData(cmd, pageIndex).GetXml();

来自这个 jquery.ajax

function GetClients(pageIndex) 
    $.ajax(
        type: "POST",
        url: "ConsultaPedidos.aspx/GetClients",
        data: 'searchTerm: "' + SearchTerm() + '", pageIndex: ' + pageIndex + '',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccess,
        failure: function (response) 
            alert(response.d);
            ,
            error: function (response) 
                alert(response.d);
            
    );

但我总是得到这个错误:

发布http://localhost:64365/ConsultaPedidos.aspx/GetClients 401 (未经授权)

奇怪的是,这在我开始验证用户之前一直有效

<system.web>
...
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" defaultUrl="/Dashboard" />
    </authentication>
    <authorization>
      <deny users="?" />
    </authorization>
...
</system.web>

有什么想法吗?

【问题讨论】:

【参考方案1】:

问题解决了

这让我发疯了。

~/App_Start/RouteConfig.cs 内更改:

settings.AutoRedirectMode = RedirectMode.Permanent;

收件人:

settings.AutoRedirectMode = RedirectMode.Off;

(或者只是注释该行)

此外,如果启用了友好 URL,您需要更改

url: "ConsultaPedidos.aspx/GetClients",

收件人:

url: '<%= ResolveUrl("ConsultaPedidos.aspx/GetClients") %>',

希望这对其他人有帮助

【讨论】:

感谢您的回答,这为我解决了问题。我在几个网站上看到有人问过这个问题,但你是唯一一个提供解决方案的人。 @iLQ 非常感谢,关闭 RedirectMode 对我有用 @iLQ 感谢您的回答。 :) @iLQ 你是怎么想出来的!太棒了...这解决了问题,但我仍然不知道为什么!?有什么想法吗? 我也有同样的问题!但是我使用的是 Asp.net web 项目,我没有 ~/App_Start/RouteConfig.cs....我该如何解决它..【参考方案2】:

~/App_Start/RouteConfig.cs里面改

settings.AutoRedirectMode = RedirectMode.Permanent;

settings.AutoRedirectMode = RedirectMode.Off;

【讨论】:

这是我第二次遇到这种情况。 您能解释一下为什么我们需要这样做吗?【参考方案3】:

401 Unauthorized 表示:

未提供用户身份验证 已提供但未通过身份验证测试

这证实了你所说的添加身份验证,它显然也涵盖了这种方法。

因此,您是否希望公开访问此方法?

公开

您需要从此方法中删除身份验证。

要允许访问公共资源(例如此网络方法),您只需将其放在同一目录中的配置文件中:

 <authorization>
        <allow users="*" /> 
 </authorization>

如果您在上面添加标签,那么它将授予所有类型的用户对所有资源的访问权限。因此,您可以添加下面的标签来授权网络服务

<location path="YourWebServiceName.asmx">
<system.web>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>

私人

您需要确保跨线路发送身份验证(使用Fiddler 检查 cookie),并确保它正在通过 asp.net 身份验证。

【讨论】:

感谢您的回答。我已经尝试过&lt;allow users="*"&gt;,但我得到了相同的响应,当检查 Fiddler 上的 cookie 时,它​​说:This response did not set any cookies. 这看起来像是罪魁祸首,没有任何 cookie,任何身份验证都会失败 - 所以要弄清楚如何从方法中删除身份验证。【参考方案4】:

你只需要在 ~/App_Start/RouteConfig.cs 中注释掉

  // settings.AutoRedirectMode = RedirectMode.Permanent;

             (Or do this)

    settings.AutoRedirectMode = RedirectMode.Off;

与 Web.config 文件中的 Authentication 无关。

【讨论】:

在我的情况下,我在路由配置中有友好的 URL 设置,默认情况下将 AutoRedirectMode 设置为永久,服务方法在关闭后触发。谢谢。【参考方案5】:

不是专家,但您尝试过将&lt;allow users="*"/&gt; 放入配置文件吗? 您的请求应该使用 GET 方法而不是 POST(用于创建)。

编辑:您似乎正在使用无法从客户端调用的 SOAP 方法,您应该使用 RESFUL 服务。

【讨论】:

是的,我已经试过了。尝试在开始身份验证之前将所有内容都放在原样,但我得到了相同的响应。 我认为您的 webmethod 只能从服务器端调用,但不确定。 @Hatsjoem:不是真的。它可以从客户端调用。它的一些身份验证问题。无论如何努力+1【参考方案6】:

我发现这个问题试图解决同样的问题,我解决的方法在这里没有看到所以我发帖给陷入同样瓶颈的人:

尝试在您的方法中使用 WebMethod 属性中的EnableSession = true

喜欢

[WebMethod(EnableSession = true)]
public static string MyMethod()

    return "no me rindo hdp";

这样就解决了我的 401 错误。希望对您有所帮助。

【讨论】:

【参考方案7】:

在我的例子中,我将 WebMethod 添加到表单上的控件中。它需要添加到页面本身。

【讨论】:

【参考方案8】:

我遇到了同样的问题,首先尝试了可用的解决方案,它确实有效。但是我意识到如果我创建一个新的web-service 并将相关代码添加到web-service 文件的App_Code 文件夹中,那么我不会收到任何错误。

【讨论】:

你能再具体一点吗?我也试过这些东西,但错误刚刚改变,它进入错误事件:状态:错误错误:内部服务器错误,没有详细信息。谢谢 没关系,我搞定了。它期待 JSON,所以我不得不 JSON.stringify(..datavalue),它现在可以工作了。【参考方案9】:

我知道您的回答已被接受。它实际上发生在创建 Web 窗体应用程序而不将 Authentication 更改为 No Authentication 时。

我们看到的默认身份验证为Authentication: Individual User Account

改成Authentication: No Authentication就不会报错了

【讨论】:

想指出,这确实发生在 2017 VS(我使用社区版)和 Web 表单应用程序中,即使使用“无身份验证”也是如此。我必须按照上面的详细说明修改 routeconfig .cs。【参考方案10】:

我的网站正在使用 ASP.NET 表单身份验证,我通过反复试验得出结论,只有在 .asmx 页面上并使用 contentType: "application/x-www-form-urlencoded"dataType: "xml" 调用 Web 方法时,我才能使其工作。 /p>

【讨论】:

【参考方案11】:

在我的情况下,问题出在调用 Ajax.asmx 的 URL 中,根据网络服务器设置,此 URL 不正确,例如"/qa/Handlers/AjaxLib.asmx/" 为我工作而不是 "/Handlers/AjaxLib.asmx/"(在我的特定情况下在 PROD 服务器上工作正常):

  $.ajax(
  url: '/qa/Handlers/AjaxLib.asmx/' + action,
  type: "POST",
  async: false,
  data: data,
  contentType: "application/json; charset=utf-8",
  success: function () 

然后我的 AJAX 被调用超出了我的 IIS 虚拟应用程序目录“qa”的范围,因此发生了授权错误 ("Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException").

【讨论】:

【参考方案12】:

允许使用 ASP.NET AJAX 从脚本调用此 Web 服务。将以下属性添加到类中

[System.Web.Script.Services.ScriptService]

我遇到了类似的问题,添加此属性解决了它。

【讨论】:

【参考方案13】:

对我来说,我的 JQuery Ajax 调用中有一个无效的“data:”参数。但不是 .NET 或 JQuery 抱怨参数值,而是(在我看来具有误导性)得到 401 Unauthorized 错误。

【讨论】:

以上是关于使用 jQuery AJAX“401(未经授权)”的 ASP.NET 调用 WebMethod的主要内容,如果未能解决你的问题,请参考以下文章

React - 带有标头的 ajax GET 请求仍返回 401(未经授权)

Django Tastypie 总是返回 401 未经授权

CORS 登录到 expressjs/passportjs 应用程序 401 未经授权

Phonegap错误:401未经授权 - 在Phonegap中使用基本身份验证的Rest API

401(未经授权)ReactJS

使用 Axios 和 Firebase 时出现 401 未经授权的错误