ASP.NET使用jQuery AJAX调用WebMethod出现"401(未经授权)"错误

63

我已经卡在这个问题上好几个小时了。

{"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);
            }
    });
}

但我总是收到这个错误:

POST 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>

有什么想法吗?

13个回答

199

问题已解决

这让我感到非常困惑。

~/App_Start/RouteConfig.cs文件中进行更改:

settings.AutoRedirectMode = RedirectMode.Permanent;

收件人:

settings.AutoRedirectMode = RedirectMode.Off;
< p >(或只需注释该行)

另外,如果启用了友好的URL,则需要更改

url: "ConsultaPedidos.aspx/GetClients",

致:

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

希望这能帮助到其他人


7
我想感谢您给出的答案,它解决了我的问题。我在几个网站上看到过人们询问这个问题,但只有您提供了解决方案。 - cost
8
我也遇到了相同的问题!但是我使用的是Asp.net web项目,我没有~/App_Start/RouteConfig.cs文件...我该如何解决它.. - Kun-Yao Wang
如何在asp.net 3.5 web表单项目中修复此错误?它没有任何routeconfig.cs文件。 - shrekDeep
我找到了很多指南,建议更改像web.config等设置,但这是唯一有效的解决方案。令人惊讶的是,这个功能不能直接使用。 - tresf
使用一个现成的C# ASP.NET Webforms项目,启用了友好的URL。请注意,将AutoRedirectMode更改为AutoRedirectMode.Off就足够了。非常感谢。 - IdusOrtus

21

~/App_Start/RouteConfig.cs 中进行更改

settings.AutoRedirectMode = RedirectMode.Permanent;
settings.AutoRedirectMode = RedirectMode.Off;

这已经是第二次让我遇到这个问题了。 - Mike
6
你能解释一下为什么我们需要这样做吗? - Adam

6

401未授权的意思是:

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

这与您关于添加身份验证的说法相符,显然也适用于此方法。

因此,您希望访问此方法是公开的还是非公开的?

公开的

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

为了允许访问公共资源(例如此Web方法),只需将其放置在同一目录中的配置文件中即可:

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

如果您使用上述标签,则将为所有类型的用户提供对所有资源的访问权限。因此,您可以添加以下标签以授权Web服务。
<location path="YourWebServiceName.asmx">
<system.web>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>

私有的:

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

谢谢你的回答。我已经尝试过<allow users="*">,但是我得到了相同的响应,当在Fiddler上检查cookie时,它显示为:This response did not set any cookies. - Daniel Cardenas
这看起来像是罪魁祸首,没有任何cookie,任何身份验证都将失败 - 因此请想办法从该方法中删除身份验证。 - m.edmondson

5

你只需要在~/App_Start/RouteConfig.cs文件中注释掉相关内容即可。

  // settings.AutoRedirectMode = RedirectMode.Permanent;

             (Or do this)

    settings.AutoRedirectMode = RedirectMode.Off;

Web.config文件中与身份验证无关。


在我的情况下,我的路由配置中有友好的URL设置,其中默认情况下将AutoRedirectMode设置为permanent。关闭后,服务方法开始工作。谢谢。 - Ravi Shankar

3
在我的情况下,我正在将WebMethod添加到表单上的控件上。它需要添加到页面本身。

3

我发现这个问题是为了解决同样的问题而存在的,我解决的方法没有在这里看到,所以我发布这篇文章给那些陷入同样瓶颈的人:

在你的方法中使用 EnableSession=true 在你的 WebMethod 属性中尝试一下

例如:

[WebMethod(EnableSession = true)]
public static string MyMethod()
{
    return "no me rindo hdp";
}

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


2

虽然我不是专家,但您是否尝试在配置文件中添加 <allow users="*"/>

您的请求应该使用GET方法而不是POST(用于创建)。

编辑:看起来您正在使用SOAP方法,这种方法无法从客户端调用,您应该使用RESTful服务。


是的,我已经尝试过了。在开始身份验证之前,尝试将所有内容都放回原位,但我得到了相同的响应。 - Daniel Cardenas
我认为你的Web方法只能从服务器端调用,但不确定。 - bobthedeveloper
@Hatsjoem:不完全是这样。它可以从客户端调用。只是一些身份验证问题。无论如何,+1 的努力。 - naveen

2

对我来说,在我的 JQuery Ajax 调用中,我有一个无效的 "data:" 参数。但是,不是 .NET 或 JQuery 抱怨参数值,而是(在我看来误导性地)得到了 401 未经授权的错误。


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

你能具体说明一下吗?我也尝试了这些方法,但错误信息只是变了,它进入了“Error”事件,并显示:状态:错误,错误信息:内部服务器错误,没有详细信息。谢谢。 - Bogdan Trusca
没关系,我已经解决了。它需要JSON格式,所以我必须使用JSON.stringify(..datavalue),现在它可以工作了。 - Bogdan Trusca

1
我知道你已经得到了答案的认可。实际上,这是在创建Web表单应用程序时发生的,而不是更改 AuthenticationNo Authentication
我们看到的默认身份验证是 Authentication: Individual User Account
如果我们改为 Authentication: No Authentication,就不会出现错误。

我想指出,这在2017 VS(我使用社区版)和Web Forms应用程序中确实发生,即使使用“无身份验证”也是如此。我不得不像上面详细说明的那样修改routeconfig .cs文件。 - zingh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接