ASP.NET Bellen WebMethod met jQuery AJAX “401 (Ongeautoriseerd)”

Hier ben je al uren mee bezig

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

Ik probeer deze WebMethod aan te roepen in mijn ASP.Net-webformulier

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

Van deze 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);
            }
    });
}

Maar ik krijg altijd deze foutmelding:

POST http://localhost:64365/ConsultaPedidos.aspx/GetClients401
(Ongeautoriseerd)

Vreemd is dat dit werkte totdat ik gebruikers begon te authenticeren

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

Enig idee?


Antwoord 1, autoriteit 100%

Probleem opgelost

Ik werd er gek van.

Binnen ~/App_Start/RouteConfig.csverandering:

settings.AutoRedirectMode = RedirectMode.Permanent;

Aan:

settings.AutoRedirectMode = RedirectMode.Off;

(Of becommentarieer de regel)

Ook als gebruiksvriendelijke URL’s zijn ingeschakeld, moet u dit wijzigen

url: "ConsultaPedidos.aspx/GetClients",

Aan:

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

Ik hoop dat dit iemand anders helpt


Antwoord 2, autoriteit 10%

Binnen ~/App_Start/RouteConfig.csverandering

settings.AutoRedirectMode = RedirectMode.Permanent;

naar

settings.AutoRedirectMode = RedirectMode.Off;

Antwoord 3, autoriteit 3%

401 Ongeautoriseerd betekent dat:

  • Gebruikersauthenticatie is niet verstrekt of
  • Het is verstrekt maar mislukte authenticatietests

Dit komt overeen met wat je hebt gezegd over het toevoegen van authenticatie, het gaat duidelijk ook over deze methode.

Wilt u daarom dat de toegang tot deze methode openbaar is of niet?

Openbaar:

  • Je moet authenticatie van deze methode verwijderen.

Om toegang tot openbare bronnen (zoals deze webmethode) toe te staan, plaats je dit eenvoudig in het configuratiebestand in dezelfde map:

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

Als u een tag boven plaatst, geeft het alle soorten gebruikers toegang tot alle bronnen. dus in plaats daarvan kun je onderstaande tag toevoegen om autorisatie te geven aan de webservice

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

Privé:

  • U moet ervoor zorgen dat authenticatie over de lijn wordt verzonden (met behulp van Fiddlerom te controleren op de cookie) , en zorg ervoor dat het de asp.net-authenticatie doorstaat.

Antwoord 4, autoriteit 2%

Je hoeft alleen commentaar te geven in ~/App_Start/RouteConfig.cs

 // settings.AutoRedirectMode = RedirectMode.Permanent;
             (Or do this)
    settings.AutoRedirectMode = RedirectMode.Off;

Er is niets te maken met verificatie in het bestand Web.config.


Antwoord 5

Geen expert, maar heb je het geprobeerd door <allow users="*"/>in het configuratiebestand te plaatsen?
Uw verzoek moet een GET-methode gebruiken en geen POST (gebruikt om te maken).

EDIT: het lijkt erop dat je een SOAP-methode gebruikt, die niet vanaf de client kan worden aangeroepen, je moet een RESFUL-service gebruiken.


Antwoord 6

Ik vond deze vraag om hetzelfde probleem op te lossen, de manier waarop ik het heb opgelost, wordt hier niet weergegeven, dus plaats ik een bericht naar iemand die in hetzelfde knelpunt zit:

Probeer in uw methode de EnableSession = truete gebruiken in uw WebMethod-kenmerk

vind ik leuk

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

Hiermee is mijn 401-fout opgelost. Hoop behulpzaam te zijn.


Antwoord 7

In mijn geval was ik de WebMethod aan het toevoegen aan een besturingselement op het formulier. Het moet aan de pagina zelf worden toegevoegd.


Antwoord 8

Ik had hetzelfde probleem en probeerde eerst de beschikbare oplossing en het werkt. Ik realiseerde me echter dat als ik een nieuwe web-servicemaak en de relevante code toevoeg in de map App_Codevan het bestand web-service, ik dat niet doe krijg geen fouten.


Antwoord 9

Ik weet dat je antwoord geaccepteerd is. Het gebeurt eigenlijk tijdens het maken van een webformuliertoepassing en het niet wijzigen van de Authenticationin No Authentication.

De standaard authenticatie die we zien als Authentication: Individual User Account

De fout treedt niet op als we veranderen naar Authentication: No Authentication


Antwoord 10

Mijn site gebruikte ASP.NET-formulierauthenticatie en ik kwam er met vallen en opstaan ​​​​uit dat ik het alleen kon laten werken als ik een webmethode aanriep met op een .asmx-pagina en met contentType: "application/x-www-form-urlencoded"en dataType: "xml"


Antwoord 11

In mijn geval zat het probleem in de URL die Ajax.asmx aanroept. Deze URL was niet correct volgens een webserverconfiguratie, b.v. "/qa/Handlers/AjaxLib.asmx/"werkte voor mij in plaats van "/Handlers/AjaxLib.asmx/"(werkt prima op PROD-servers in mijn specifieke situatie) :

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

Mijn AJAX werd vervolgens aangeroepen buiten het bereik van mijn IIS virtuele applicatiemap “qa”, vandaar dat er een autorisatiefout is opgetreden ({"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}).


Antwoord 12

Om deze webservice te laten aanroepen vanuit een script, met behulp van ASP.NET AJAX. Voeg het volgende kenmerk toe aan de klas

[System.Web.Script.Services.ScriptService]

Ik had een soortgelijk probleem en het toevoegen van dit kenmerk loste het op.


Antwoord 13

Voor mij had ik een ongeldige parameter “data:” in mijn JQuery Ajax-aanroep. Maar in plaats van .NET of JQuery te klagen over de parameterwaarden, kreeg ik (misleidend naar mijn mening) de 401 Unauthorized-fout.

Other episodes