ASP.NET WindowsAuthentication personnalisé 401 non autorisé page d'erreur
J'ai un ASP.NET site web avec authentification à l'aide d'ActiveDirectory.
Maintenant, lorsqu'un utilisateur authentifié ouvre une page, il est automatiquement authentifié. J'ai été confrontée à un problème: lorsqu'un utilisateur non authentifié (par exemple, Mozilla Firefox utilisateur non défini network.automatic-ntlm-auth.trusted-uris
propriété) ouvre une page, IIS envoie 401 réponse et demande un login \ mot de passe.
Ce que je veux, c'est pas à lui demander un login \ mot de passe juste vous montrer une page d'erreur personnalisée. Il semble assez simple pour les utilisateurs authentifiés par obtenir la page demandée, non-authentifié êtes redirigé vers une page d'erreur personnalisée. Il serait beau travail pour FormsAuthentication.
Cependant, j'ai essayé de nombreuses façons par maintenant. Tout Le Web.config redirections ne fonctionnent pas. Même si j'ai clairement un Response
et y mettre une redirection - je obtenir une boucle car cette page personnalisée (*par exemple, /Error/AccessDenied
) aussi requiert une authentification. Marquage d'un contrôleur de AllowAnonymous
ne fait rien.
Cependant, si j'active l'authentification Anonyme dans le Gestionnaire des services IIS, véritable domaine authentifié les utilisateurs ne sont pas autorisés lors de l'ouverture d'un site web.
Comment puis-je résoudre ce problème?
- Vous voulez que les non-utilisateurs d'internet explorer pour être rediriger vers une autre page? La réécriture d'URL en fonction de l'Utilisateur de l'Agent est le chemin à parcourir.
- Pas possible. La première demande de navigateur est toujours anonyme. IIS répond toujours avec
401 Unauthorized
avecwww.authenticate: negotiate
(ou NTLM ou les deux) en-tête. Le client (navigateur) puis demande à nouveau avecAuthorization: Negotiate ..hash..
en-tête de ce temps. En fonction de confiance-site, le navigateur va toujours demander des informations d'identification. Vous ne pouvez pas afficher un message d'erreur personnalisé, parce que la première réponse est toujours401
, peu importe. - Vous pourriez écrire un module HTTP et crochet sur HttpApplication.PostAuthenticateRequest. De là, vous pouvez utiliser HttpContext.RewritePath et/ou à peu près jouer avec la réponse au contexte de la façon dont vous le souhaitez. Difficile d'en dire plus w/o clairement un cas de reproduction.
- En tant que votre réponse m'a aidé le plus, je tiens à donner une prime à elle. Pourriez-vous, s'il vous plaît, poster comme la réponse?
- Ne vous inquiétez pas au sujet de la bounty. Obtenir votre problème résolu, est le plus important. Veuillez accepter votre réponse. Il est bien écrit et transmet les pièces importantes bien. Sinon, juste attendre la fin de la bounty période, Vous ne savez jamais, vous pourriez obtenir une meilleure réponse. 🙂
- est-il possible que je peux avoir tous les produits par le système d'erreur dans ma demande de mise en page. Je ne veux pas de page personnalisé pour diffrent erreur. Je veux juste système d'affichage de message généré est aussi, mais dans mon _layout.cshtml page. Merci.
Vous devez vous connecter pour publier un commentaire.
Grâce à @Abhitalks pour expliquer comment il fonctionne dans les commentaires. Je ne sais pas pourquoi, mais j'étais sûr que l'IE et Google Chrome sont l'envoi de l'autorisation d'en-tête sur la première demande et, c'est pourquoi, seuls les utilisateurs non autorisés d'obtenir réponse 401. Après j'ai compris que je ne peut pas éviter de réponse 401 à tous, j'ai décidé d'utiliser cette approche simple que ce comportement est le plus proche de souhaitable.
J'ai ajouté la méthode suivante dans
Global.asax
:Désormais, lorsqu'un utilisateur ouvre une page, le serveur lui retourne une page d'erreur personnalisée, mais avec
401 Unauthorized
en-tête.Chrome, IE ou bien configuré Firefox. Les utilisateurs demande une URL, le serveur renvoie la page d'erreur avec 401-tête - un navigateur complète automatiquement l'autorisation défi, redirige vers la même URL, le serveur renvoie la page correcte et 200 aujourd'hui. L'utilisateur ne pourra pas voir cette page d'erreur.
Non configuré Firefox. L'utilisateur demande une URL, le serveur renvoie la page d'erreur avec 401-tête - un navigateur ne peut pas terminer l'autorisation défi et invite l'utilisateur des informations d'identification.
Utilisateur entre de connexion correct. L'utilisateur demande la même URL, encore une fois, obtient une page et 200 OK.
Utilisateur entre de connexion incorrectes. Un navigateur demande d'informations d'identification de nouveau.
Utilisateur appuie sur Annuler. Un navigateur affiche la page d'erreur personnalisée qui a été envoyé d'en-tête 401. Cette page indique à l'utilisateur que s'il est à l'aide de Firefox, puis il faut entrer ses informations d'identification ou d'autoriser automatique de l'authentification NTLM.
Ajout Important à Yeldar commentaire:
Lors de la modification du message de réponse pour les demandes à distance (lire: non localhost), vous devrez ajouter la ligne suivante à votre fichier de configuration:
Si vous n'autorisez pas la réponse à "passer à travers" les clients distants obtiendrez la valeur par défaut
"You do not have permission to view this directory or page"
.J'ai eu cette info par: https://stackoverflow.com/a/17324195/3310441
Remplacer la HandleUnauthorizedRequest méthode d'Autoriser attribut.
Ex: