É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?
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
Changement de ~/App_Start/RouteConfig.cs
à l'intérieur
settings.AutoRedirectMode = RedirectMode.Permanent;
à
settings.AutoRedirectMode = RedirectMode.Off;
401 Non autorisé signifie que:
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:
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é:
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.
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.
Dans mon cas, j'ajoutais la méthode Web à un contrôle du formulaire. Il doit être ajouté à la page elle-même.
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.
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"}).
.
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
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"
.