web-dev-qa-db-fra.com

ASP.NET appelant WebMethod avec jQuery AJAX "401 (non autorisé)"

Été coincé avec cela pendant des heures

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

J'essaie d'appeler ce WebMethod dans mon Webform ASP.Net

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

De ce 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);
            }
    });
}

Mais je reçois toujours cette erreur:

POST http://localhost:64365/ConsultaPedidos.aspx/GetClients 401 (Non autorisé)

Ce qui est étrange, c'est que cela fonctionnait jusqu'à ce que je commence à authentifier les utilisateurs

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

Des idées?

33
Daniel Cardenas

Problème résolu

Cela me rendait fou.

À l'intérieur de ~/App_Start/RouteConfig.cs change:

settings.AutoRedirectMode = RedirectMode.Permanent;

À:

settings.AutoRedirectMode = RedirectMode.Off;

(Ou simplement commenter la ligne)

De plus, si les URL conviviales sont activées, vous devez modifier

url: "ConsultaPedidos.aspx/GetClients",

À:

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

J'espère que cela aidera quelqu'un d'autre

133
Daniel Cardenas

Changement de ~/App_Start/RouteConfig.cs à l'intérieur

settings.AutoRedirectMode = RedirectMode.Permanent;

à

settings.AutoRedirectMode = RedirectMode.Off;
9
user3913452

401 Non autorisé signifie que:

  • L'authentification de l'utilisateur n'a pas été fournie ou
  • Il a été fourni mais les tests d'authentification ont échoué

Cela corrobore ce que vous avez dit sur l’ajout d’une authentification, il couvre clairement cette méthode également.

Par conséquent, voulez-vous que l'accès à cette méthode soit public ou non?

Publique:

  • Vous devez supprimer l'authentification de cette méthode.

Pour autoriser l'accès aux ressources publiques (telles que cette méthode Web), vous devez simplement placer ceci dans le fichier de configuration dans le même répertoire:

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

si vous mettez au-dessus de la balise, cela donnera le droit d'accès à tous les types d'utilisateurs et à toutes les ressources. donc au lieu de cela, vous pouvez ajouter la balise ci-dessous pour autoriser le service Web

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

Privé:

  • Vous devez vous assurer que l'authentification est envoyée sur la ligne (à l'aide de Fiddler pour rechercher le cookie) et vous assurer qu'il transmet l'authentification asp.net.
5
m.edmondson

Pas un expert, mais avez-vous essayé en mettant <allow users="*"/> dans le fichier de configuration? Votre requête devrait utiliser une méthode GET et non un POST (utilisé pour créer).

EDIT: Il semble que vous utilisiez une méthode SOAP, qui ne peut pas être appelée depuis le côté client, vous devez utiliser un service RESFUL.

2
bobthedeveloper

J'ai trouvé cette question essayant de résoudre le même problème, la façon dont j'ai résolu n'est pas vu ici, alors je poste à quelqu'un coincé dans le même goulot d'étranglement: 

Essayez dans votre méthode, utilisez le EnableSession = true dans votre attribut WebMethod

comme 

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

avec cela est résolu mon erreur 401. J'espère être utile.

1
RokumDev

Dans mon cas, j'ajoutais la méthode Web à un contrôle du formulaire. Il doit être ajouté à la page elle-même.

1
Jeff Davis

J'ai rencontré le même problème et j'ai d'abord essayé la solution disponible et qui fonctionne. Cependant, j'ai réalisé que si je crée un nouveau web-service et que j'ajoute le code pertinent dans le dossier App_Code du fichier web-service, je ne reçois aucune erreur. 

0
Izzy

Dans mon cas, le problème était dans l'URL qui appelle Ajax.asmx. Cette URL n'était pas correcte selon une configuration de serveur Web, par exemple. "/qa/Handlers/AjaxLib.asmx/" a fonctionné pour moi au lieu de "/Handlers/AjaxLib.asmx/" (fonctionne très bien sur les serveurs PROD dans ma situation particulière): 

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

Mon AJAX a ensuite été appelé en dehors de la portée de mon répertoire d'applications virtuelles IIS "qa". Une erreur d'autorisation est donc survenue ({"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"})..

0
Honza P.

Je sais que ta réponse a été acceptée. Cela se produit réellement lors de la création d'une application Web Form et que vous ne modifiez pas la variable Authentication en No Authentication.

L'authentification par défaut que nous voyons comme Authentication: Individual User Account 

L'erreur ne viendra pas si nous changeons en Authentication: No Authentication

0
Sabyasachi Mishra

Mon site utilisait l’authentification de formulaires ASP.NET et j’ai trouvé, par essais et erreurs, que je ne pourrais le faire fonctionner que si j’appelais une méthode Web avec une page .asmx et avec contentType: "application/x-www-form-urlencoded" et dataType: "xml".

0
Matthew Lock