c# - ASP.NET WindowsAuthentication 自定义 401 未授权错误页面

标签 c# asp.net asp.net-mvc authentication windows-authentication

我有一个使用 ActiveDirectory 进行身份验证的 ASP.NET 网站。

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

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

但是,到目前为止,我已经尝试了很多方法。任何 Web.config 重定向都不起作用。即使我清除了一个 Response 并在那里放置了一个重定向 - 我也会得到一个循环,因为这个自定义页面(*例如,/Error/AccessDenied)也需要身份验证。将 Controller 标记为 AllowAnonymous 不会执行任何操作。

但是,如果我在 IIS 管理器中启用匿名身份验证,则真正经过身份验证的域用户在打开网站时不会获得授权。

我该如何解决这个问题?

最佳答案

感谢@Abhitalks 在评论中解释它是如何工作的。我不知道为什么,但我确定 IE 和 Google Chrome 会在第一次请求时发送授权 header ,这就是为什么只有未经授权的用户才能获得 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 header 。

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

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

  • 用户输入正确的登录信息。用户再次请求相同的 URL,获得一个页面和 200 OK。

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

  • 用户按下取消。浏览器显示已发送的带有 header 401 的自定义错误页面。此页面告诉用户,如果他使用的是 Firefox,则他应该输入他的凭据或允许自动 NTLM 身份验证。

关于c# - ASP.NET WindowsAuthentication 自定义 401 未授权错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32139662/

相关文章:

c# - 在 ASP.NET Web 应用程序中将异步/等待与任务一起使用时,UI 线程被阻塞

asp.net - 我怎样才能把一个asp :textbox into a multiline <textarea>?

c# - 如何在 mvc3 View 中的 foreach 中调用 javascript 函数

asp.net-mvc - 使用 MVC HttpPostedFileBase == null 上传文件

c# - mongo.linq 与 c# linq 之间的区别

c# - 获取 C :\Users Programmatically

c# - 邮件发件人不工作

c# - 在析构函数中使用 null 条件运算符是不好的做法吗?

c# - 最小起订量验证表达式

c# - 如何访问 MVC 3 中 Request.Form 集合中未验证的项目