2015-08-21 128 views
12

我有一个使用ActiveDirectory进行身份验证的ASP.NET网站。ASP.NET WindowsAuthentication自定义401未经授权的错误页面

现在,当通过身份验证的用户打开一个页面时,他会自动进行身份验证。我遇到了一个问题 - 当未经身份验证的用户(例如,未定义为network.automatic-ntlm-auth.trusted-uris属性的Mozilla Firefox用户)打开页面时,IIS将发送401响应并提示输入登录名\密码。

我想要的是不要提示他输入登录名\密码 - 只显示一个自定义错误页面。这听起来很简单 - 通过身份验证的用户可以获得所请求的页面,未经身份验证的用户可以重定向到自定义错误页面。它对于FormsAuthentication来说工作得很好。

但是,现在我已经尝试了很多方法。任何Web.config重定向都不起作用。即使我清除了一个Response并放置了一个重定向 - 我将得到一个循环,因为此自定义页面(*例如,/Error/AccessDenied)也需要身份验证。标记控制器为AllowAnonymous什么也不做。

但是,如果我在IIS管理器中启用了匿名身份验证,则当真实身份验证的域用户在打开网站时没有被授权。

我该如何解决这个问题?

+0

你想非IE用户重定向到另一个页面?基于用户代理的URL重写是一条路。 –

+0

不可能。首先来自浏览器的请求始终是匿名的。 IIS总是通过'www.authenticate:negotiate'(或NTLM或两者)头以'401 Unauthorized'响应。然后客户端(浏览器)再次使用'Authorization:Negotiate ..hash..'头部来请求这次。根据可信站点,浏览器***将***总是要求凭证。无法显示自定义错误,因为第一个响应始终为“401”。 – Abhitalks

+0

你可以编写一个HTTP模块并钩上HttpApplication.PostAuthenticateRequest。从那里你可以使用HttpContext.RewritePath和/或以你想要的方式使用响应上下文。很难说没有明确的repro案例。 –

回答

14

感谢@Abhitalks解释如何在评论中发挥作用。我不知道为什么,但我确定IE和谷歌浏览器在第一次请求时发送授权标头,这就是为什么只有未经授权的用户才能得到401响应。在理解了我无法避免401响应后,我决定使用这种简单的方法,因为这种行为是最接近理想的。

我已经添加了以下方法Global.asax

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.StatusCode == 401) 
    { 
     Response.ClearContent(); 
     Response.WriteFile("~/Static/NotAuthorized.html"); 
     Response.ContentType = "text/html"; 
    } 
} 

现在,当用户打开一个页面时,服务器会返回他自定义错误页,但与401 Unauthorized头。

Chrome,IE或配置良好的Firefox Firefox。用户请求URL,服务器返回带有401头的错误页面 - 浏览器自动完成授权挑战,重定向到相同的URL,服务器现在返回正确的页面和200。用户不会看到这个错误页面。

未配置的Firefox。用户请求一个URL,服务器返回带有401头的错误页面 - 浏览器无法完成授权质询并提示用户输入凭据。

  • 用户输入正确的登录。用户再次请求相同的URL,获取一个页面并确定200。

  • 用户输入错误的登录名。浏览器会再次提示输入凭据。

  • 用户压按取消。浏览器显示已经与报头401一起发送的自定义错误页面。该页面告诉用户,如果他使用的是Firefox,那么他应该输入他的凭据或允许自动NTLM身份验证。

+0

谢谢,正在寻找这个。为你+1 – KoenW

1

重要补充Yeldar的评论:

当改变的远程请求(读:非本地主机)的响应消息,你需要将以下添加到您的配置文件:

<system.webServer> 
    <httpErrors existingResponse="PassThrough"></httpErrors> 
</system.webServer> 

如果您不允许响应“通过”远程客户端将获得默认"You do not have permission to view this directory or page"

我从这个信息得到:https://stackoverflow.com/a/17324195/3310441

相关问题