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 avec www.authenticate: negotiate (ou NTLM ou les deux) en-tête. Le client (navigateur) puis demande à nouveau avec Authorization: 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 toujours 401, 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.