使用 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 身份验证。【讨论】:
感谢您的回答。我已经尝试过<allow users="*">
,但我得到了相同的响应,当检查 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】:不是专家,但您尝试过将<allow users="*"/>
放入配置文件吗?
您的请求应该使用 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(未经授权)
CORS 登录到 expressjs/passportjs 应用程序 401 未经授权