Authentification Javascript / Ajax NTLM
je développe une application mobile HTML5, qui communique avec WebServices
. Les services web utilisent le protocole D'authentification NTLM. J'ai des difficultés à gérer la poignée de main via JavaScript. NTLM envoie le 401 unauthorized
en réponse à mon message, auquel je n'ai trouvé aucun moyen de répondre.
L'authentification NTLM est-elle possible avec JavaScript? Dois-je construire un service Web par procuration avec, par exemple, une authentification de base entre les deux?
mon appel jQuery est quelque chose comme...
$.ajax({
type: "POST",
url: URL,
contentType: "text/xml",
dataType: "xml",
data: soapRequest,
username: 'username',
password: 'password',
xhrFields: {
withCredentials: true
},
success: processSuccess,
error: processError
});
4 réponses
d'après ce que j'ai vu, personne N'a implémenté Windows Integrated / NTLM auth avec AJAX, bien qu'il devrait être possible (j'envisage de le faire pour un projet en cours de combiner l'authentification de forme avec le WindowsTokenRoleProvider)
Le flux de production de base devrait ventilation comme celle-ci (basée sur les articles ici et ici):
- faire une requête GET avec un message NTLM base64-encoded type-1 le En-tête "autorisation"
- prendre le message NTLM base64-encoded type-2 sortie de L'en-tête" WWW-Authenticate " de la réponse 401.
- effectuer le NTLM sur le fonctionnement des noonce reçu à l'étape précédente (désolé je n'ai pas un exemple de code encore)
- effectuer un dernier GET avec un message NTLM de type 3 encodé en base64 dans l'en-tête" Authorization". Ça devrait rapporter 200.
NTLM auth sur HTTP est plus une implémentation CHAP en utilisant HTTP than it est une requête HTTP autorisée.
je vous tiendrai au courant si je commence vraiment à implémenter ceci. Désolé je ne pouvais pas être de plus d'aide.
le problème est que vous ne pouvez pas obtenir le domaine/utilisateur actuellement connecté via javascript (ou si vous pouvez je n'ai jamais trouvé de solution).
si vous connaissez déjà le domaine, le nom d'utilisateur et le mot de passe, vous pouvez utiliser quelque chose comme https://github.com/erlandranvinge/ntlm.js/tree/master
cependant je pense que descendre cette méthode pour un seul signe va être frustrant à long terme.
nous avons fini par faire l'authentification NTLM dans un caché iframe et accès à l'iframe via javascript.
vous n'avez pas à répondre au défi NTLM (Integrated Windows Authentication), votre navigateur devrait le faire pour vous, s'il est correctement configuré. Un certain nombre de complications supplémentaires sont probablement trop.
Étape 1-Navigateur
vérifiez que le navigateur peut accéder et envoyer vos justificatifs d'identité avec une application web NTLM ou en tapant sur le logiciel que vous développez directement en premier.
Étape 2 - JavaScript aveccredentials l'attribut
401 non autorisé erreur reçue et les symptômes décrits sont exactement les mêmes lorsque j'ai échoué à définir l'attribut "withCredentials" à "true". Je ne suis pas familier avec jQuery, mais assurez-vous que votre tentative de définir cet attribut est réussie.
Cet exemple fonctionne pour moi:
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
if (xhttp.readyState === XMLHttpRequest.DONE) {
if (xhttp.status === 200)
doSomething(xhttp.responseText);
else
console.log('There was a problem with the request.');
}
};
Étape 3-Côté Serveur activer CORS (optionnel)
je soupçonne une raison majeure pourquoi les gens finissent à ce la question Est qu'ils développent une composante sur leur poste de travail avec une autre composante hébergée ailleurs. Cela provoque Cross-Origin Resource Sharing (CORS) questions. Il y a deux solutions:
- désactiver les CORS dans votre navigateur-bon pour le développement quand finalement votre travail sera déployé sur la même origine que la ressource à laquelle votre code accède.
- activer CORS sur votre serveur - il y a beaucoup de lecture sur l'internet plus large, mais il s'agit essentiellement d'envoyer des en-têtes permettant le CORS.
en bref, pour activer CORS avec les informations d'identification il faut:
- envoyer un en-tête' Access-Control-Allow-Origin ' qui correspond à l'origine de la page servie ... cela ne peut pas être '*'
- envoyer un' Access-Control-Allow-Credentials 'avec la valeur'true'
Voici mon exemple de code de travail .NET dans mon global.fichier asax. Je pense que c'est assez facile à voir ce qui se passe et traduisez vers d'autres langues si nécessaire.
void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.HttpMethod == "OPTIONS")
{
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
Response.AddHeader("Access-Control-Max-Age", "1728000");
Response.End();
}
else
{
Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.Headers["Origin"] != null)
Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
else
Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt!
}
}
Ouais NTLM n'est pas très amusant. Mais vous pourriez vouloir essayer cette, https://github.com/tcr/node-ntlm/blob/master/README.md