Windows身份验证不会挑战域外的浏览器

时间:2011-09-05 16:27:26

标签: asp.net asp.net-mvc windows-authentication ntlm

我有一个允许匿名访问和Windows身份验证的Web应用程序。

基本上,该应用尝试自动登录用户通过窗口认证如果Windows用户是在应用程序的用户列表中,否则它显示登录屏幕。如果没有提供凭证,则应用程序会显示登录屏幕,用户可以使用应用程序内部用户登录。

据我所知,Windows身份验证是一个具有挑战性的协议,所以我要以迫使浏览器发送凭据返回未经授权。

当我的域内有机器时,效果很好。

我的域中用户在列表中的计算机:

  • 没有凭据的浏览器发出请求。
  • 网络应用自定义授权过滤器拒绝连接(质询)。
  • 浏览器使用Windows凭据重新发出请求。
  • 网络应用程序验证该Windows用户并允许它获取它。

我的域中的用户不在允许列表中的计算机:

  • 没有凭据的浏览器发出请求。
  • 网络应用自定义授权过滤器拒绝连接(质询)。
  • 浏览器使用Windows凭据重新发出请求。
  • 网络应用无法验证请求并重定向到登录屏幕。

现在出现了问题。

机器离开我的域,用户不在允许的列表中:

  • 没有凭据的浏览器发出请求。
  • 网络应用自定义授权过滤器拒绝连接(质询)。
  • 浏览器显示Windows登录屏幕,并且不会重新发出请求。

为什么在服务器未经授权返回时不会重新发出请求?

如果我关闭身份验证对话框并刷新浏览器,则应用程序会重定向到登录页面。

问候。

1 个答案:

答案 0 :(得分:1)

好吧,如果计算机位于服务器域之外,浏览器将不会尝试发送凭据(因为它在Windows身份验证方面可能毫无意义),并且它将在第一个HTTP 401之后提示输入凭据。< / p>

解决方案是同时启用匿名身份验证和Windows身份验证,并匿名访问LogOn页面。在LogOn页面中放置登录控件,以及一个名为“Windows Login”的按钮,该按钮导航到名为“WindowsAuth”的操作方法。在该操作方法中,如果不是HttpUnauthorizedResult,则返回Request.LogonUserIdentity.IsAuthenticated,否则重定向到Home,这将强制浏览器发送Windows凭据。

如果域外的浏览器尝试执行“Windows登录”,它将获得一个不错的“HTTP 401 Unauthorized”页面,因此他可以回击并以传统方式执行登录。

我希望这有助于某人。