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

Dan*_*nas 44 c# asp.net ajax jquery webmethod

被困这几个小时了

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}
Run Code Online (Sandbox Code Playgroud)

我试图在我的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();
}
Run Code Online (Sandbox Code Playgroud)

从这个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);
            }
    });
}
Run Code Online (Sandbox Code Playgroud)

但我总是得到这个错误:

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>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Dan*_*nas 152

问题解决了

这让我发疯了.

里面〜/ App_Start/RouteConfig.cs改变:

settings.AutoRedirectMode = RedirectMode.Permanent;
Run Code Online (Sandbox Code Playgroud)

至:

settings.AutoRedirectMode = RedirectMode.Off;
Run Code Online (Sandbox Code Playgroud)

(或者只是评论一下)

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

url: "ConsultaPedidos.aspx/GetClients",
Run Code Online (Sandbox Code Playgroud)

至:

url: '<%= ResolveUrl("ConsultaPedidos.aspx/GetClients") %>',
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人

  • 我想感谢你的回答,这为我解决了这个问题.我见过有人在几个网站上询问过这个问题,但你是唯一提供解决方案的人. (6认同)
  • 我只是有同样的问题!但是我使用Asp.net web项目,我没有〜/ App_Start/RouteConfig.cs ....我该怎么解决它.. (6认同)

小智 11

内部~/App_Start/RouteConfig.cs变化

settings.AutoRedirectMode = RedirectMode.Permanent;
Run Code Online (Sandbox Code Playgroud)

settings.AutoRedirectMode = RedirectMode.Off;
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下为什么我们需要这样做吗? (4认同)

m.e*_*son 5

401 Unauthorized意味着:

  • 尚未提供用户身份验证
  • 提供但验证测试失败

这证实了你所说的关于添加身份验证的内容,它显然也涵盖了这种方法.

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

公众:

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

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

 <authorization>
        <allow users="*" /> 
 </authorization>
Run Code Online (Sandbox Code Playgroud)

如果您将上面的标记放在上面,那么它将为所有资源提供对所有类型用户的访问权限.因此,您可以添加以下标记来授予Web服务授权

<location path="YourWebServiceName.asmx">
<system.web>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>
Run Code Online (Sandbox Code Playgroud)

私人:

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


Md *_*iar 5

您只需在 ~/App_Start/RouteConfig.cs 中注释掉即可

  // settings.AutoRedirectMode = RedirectMode.Permanent;

             (Or do this)

    settings.AutoRedirectMode = RedirectMode.Off;
Run Code Online (Sandbox Code Playgroud)

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