ASP.NET Вызов WebMethod с jQuery AJAX "401 (несанкционированный)"

Застрял с этим в течение нескольких часов

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

Я пытаюсь вызвать этот WebMethod в своей ASP.NET Webform

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

Есть идеи?

Ответ 1

Задача решена

Это сводило меня с ума.

Внутри ~/App_Start/RouteConfig.cs изменить:

settings.AutoRedirectMode = RedirectMode.Permanent;

Для того, чтобы:

settings.AutoRedirectMode = RedirectMode.Off;

(Или просто прокомментируйте строку)

Кроме того, если включены дружественные URL-адреса, вам необходимо изменить

url: "ConsultaPedidos.aspx/GetClients",

Для того, чтобы:

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

Надеюсь, это поможет кому-то еще

Ответ 2

Внутри ~/App_Start/RouteConfig.cs изменить

settings.AutoRedirectMode = RedirectMode.Permanent;

в

settings.AutoRedirectMode = RedirectMode.Off;

Ответ 3

401 Несанкционированное означает, что:

  • Аутентификация пользователя не была предоставлена или
  • Он был предоставлен, но не прошел проверки подлинности

Это подтверждает то, что вы сказали о добавлении аутентификации, и это явно охватывает этот метод.

Поэтому вы хотите, чтобы доступ к этому методу был общедоступным или нет?

Публикация:

  • Вам необходимо удалить аутентификацию из этого метода.

Чтобы разрешить доступ к общедоступным ресурсам (например, этот веб-метод), вы просто помещаете это в файл конфигурации в том же каталоге:

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

если вы поместите выше тег, тогда он предоставит право доступа всем пользователям со всеми ресурсами. поэтому вместо этого вы можете добавить тег ниже, чтобы дать авторизацию веб-службе

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

Частный:

  • Вы должны убедиться, что аутентификация отправляется по всей линии (с помощью Fiddler для проверки файла cookie) и убедитесь, что она передает аутентификацию asp.net.

Ответ 4

Не эксперт, но вы попробовали, поставив <allow users="*"/> в файл конфигурации? В вашем запросе должен использоваться метод GET, а не POST (используется для создания).

EDIT: Кажется, что вы используете метод SOAP, который нельзя вызвать на стороне клиента, вы должны использовать услугу RESFUL.

Ответ 5

Я нашел этот вопрос, пытаясь решить ту же проблему, так, как я решил, здесь не видно, поэтому я отправляю сообщение кому-то, застрявшему в том же узком месте:

Попробуйте в своем методе использовать EnableSession = true в вашем атрибуте WebMethod

как

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

с этим решена моя ошибка 401. Надеюсь быть полезным.

Ответ 6

В моем случае я добавлял WebMethod к элементу управления формы. Его нужно добавить к самой странице.

Ответ 7

Я столкнулся с той же проблемой и, во-первых, попробовал доступное решение, и оно действительно работает. Однако я понял, что если я создаю новую web-service и добавлю соответствующий код в папку App_Code файла web-service то я не получу никаких ошибок.

Ответ 8

Я знаю, что ваш ответ принят. Это фактически происходит при создании приложения веб-формы и не меняет Authentication на No Authentication.

Аутентификация по умолчанию, которую мы видим как Authentication: Individual User Account

Ошибка не придет, если мы перейдем к Authentication: No Authentication

Ответ 9

Мой сайт с помощью ASP.NET форм проверки подлинности, и я работал путем проб и ошибок, что я мог получить только это работать, если я называюсь веб - метод с на .asmx страницы и с contentType: "application/x-www-form-urlencoded" и dataType: "xml"

Ответ 10

В моем случае проблема была в URL, который вызывает Ajax.asmx, этот 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"}).

Ответ 11

Вы должны комментировать только в ~/App_Start/RouteConfig.cs

  // settings.AutoRedirectMode = RedirectMode.Permanent;

             (Or do this)

    settings.AutoRedirectMode = RedirectMode.Off;

Нет ничего общего с аутентификацией в файле Web.config.