wake-up-neo.net

ASP.NET Aufruf von WebMethod mit jQuery AJAX "401 nicht Autorisiert)"

Seit Stunden stecken geblieben

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

Ich versuche, diese WebMethod in meinem ASP.Net-Webformular .__ aufzurufen.

[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();
}

Von diesem 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);
            }
    });
}

Ich bekomme aber immer diesen Fehler:

POST http://localhost:64365/ConsultaPedidos.aspx/GetClients 401 (Nicht autorisiert)

Merkwürdig ist, dass dies so lange funktionierte, bis ich mit der Authentifizierung von Benutzern begann

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

Irgendwelche Ideen?

33
Daniel Cardenas

Problem gelöst

Das hat mich verrückt gemacht.

Innerhalb von ~/App_Start/RouteConfig.cs change:

settings.AutoRedirectMode = RedirectMode.Permanent;

Zu:

settings.AutoRedirectMode = RedirectMode.Off;

(Oder kommentieren Sie einfach die Zeile)

Wenn benutzerfreundliche URLs aktiviert sind, müssen Sie .__ ändern.

url: "ConsultaPedidos.aspx/GetClients",

Zu:

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

Hoffe das hilft jemand anderem

133
Daniel Cardenas

Innerhalb ~/App_Start/RouteConfig.cs ändern

settings.AutoRedirectMode = RedirectMode.Permanent;

zu

settings.AutoRedirectMode = RedirectMode.Off;
9
user3913452

401 Nicht autorisiert bedeutet, dass:

  • Benutzerauthentifizierung wurde nicht bereitgestellt oder
  • Es wurden Authentifizierungstests bereitgestellt, jedoch fehlgeschlagen

Dies stimmt mit dem überein, was Sie über das Hinzufügen der Authentifizierung gesagt haben, und deckt auch diese Methode eindeutig ab.

Möchten Sie, dass der Zugriff auf diese Methode öffentlich ist oder nicht?

Öffentlichkeit:

  • Sie müssen die Authentifizierung von dieser Methode entfernen.

Um den Zugriff auf öffentliche Ressourcen (z. B. diese Webmethode) zu ermöglichen, platzieren Sie dies einfach in der Konfigurationsdatei im selben Verzeichnis:

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

wenn Sie das Tag oben setzen, erhalten alle Benutzer Zugriff auf alle Ressourcen. Stattdessen können Sie unten ein Tag hinzufügen, um die Berechtigung für den Webservice zu erteilen

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

Privatgelände:

  • Sie müssen sicherstellen, dass die Authentifizierung über die gesamte Leitung gesendet wird (mithilfe von Fiddler , um nach dem Cookie zu suchen), und sicherstellen, dass die asp.net-Authentifizierung übergeben wird.
5
m.edmondson

Kein Experte, aber Sie haben es versucht, indem Sie <allow users="*"/> in die Konfigurationsdatei schreiben? Ihre Anfrage sollte eine GET-Methode und keine POST (zum Erstellen) verwenden.

BEARBEITEN: Es scheint, dass Sie eine SOAP - Methode verwenden, die nicht von Clientseite aus aufgerufen werden kann. Sie sollten einen RESFUL-Dienst verwenden.

2
bobthedeveloper

Ich habe diese Frage gefunden, um das gleiche Problem zu lösen. Die Art und Weise, wie ich sie gelöst habe, ist hier nicht zu sehen. Ich poste sie an jemanden, der im selben Engpass steckt: 

Versuchen Sie in Ihrer Methode den EnableSession = true in Ihrem WebMethod-Attribut

mögen 

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

damit ist mein 401 fehler behoben. Hoffe hilfreich.

1
RokumDev

In meinem Fall fügte ich die WebMethod zu einem Steuerelement im Formular hinzu. Es muss der Seite selbst hinzugefügt werden.

1
Jeff Davis

Ich stand vor dem gleichen Problem und probierte zunächst die verfügbare Lösung aus, die funktioniert. Mir wurde jedoch klar, dass ich, wenn ich einen neuen web-service erstelle und den relevanten Code im App_Code-Ordner der web-service-Datei hinzufüge, keine Fehler bekomme. 

0
Izzy

In meinem Fall lag das Problem in einer URL, die Ajax.asmx aufruft. Diese URL war gemäß einem Webserver-Setup nicht korrekt, z. "/qa/Handlers/AjaxLib.asmx/" arbeitete für mich anstelle von "/Handlers/AjaxLib.asmx/" (funktioniert auf PROD-Servern in meiner speziellen Situation gut): 

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

Mein AJAX wurde dann außerhalb des Gültigkeitsbereichs meines virtuellen IIS Anwendungsverzeichnisses "qa" aufgerufen. Daher trat ein Autorisierungsfehler auf. ({"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}).

0
Honza P.

Ich weiß, dass Sie Ihre Antwort akzeptiert haben. Dies geschieht tatsächlich, wenn Sie eine Web Form-Anwendung erstellen und Authentication nicht in No Authentication ändern.

Die Standardauthentifizierung sehen wir als Authentication: Individual User Account 

Der Fehler wird nicht angezeigt, wenn wir zu Authentication: No Authentication wechseln.

0

Meine Website hat ASP.NET-Formularauthentifizierung verwendet und ich habe durch Ausprobieren herausgefunden, dass ich sie nur dann zum Laufen bringen kann, wenn ich eine Webmethode mit einer .asmx-Seite und mit contentType: "application/x-www-form-urlencoded" und dataType: "xml"

0
Matthew Lock