2011-09-05 191 views
1

我有一个允许匿名访问和Windows身份验证的Web应用程序。Windows身份验证不会挑战域外的浏览器

基本上,如果Windows用户在应用程序中的用户列表中,该应用程序尝试通过Windows身份验证自动登录用户,否则会显示登录屏幕。如果未提供凭证,则应用程序会显示登录屏幕,用户可以使用应用程序内部用户登录。

据我所知,Windows身份验证是一个具有挑战性的协议,所以我必须返回未经授权才能强制浏览器发送凭证。

它在我的域内使用机器时效果很好。

机在我的域名,用户是在列表中:

  • 浏览器没有凭据发出请求。
  • 网络应用程序自定义授权筛选器拒绝连接(挑战)。
  • 浏览器使用Windows凭据重新发出请求。
  • 网络应用认证该Windows用户,并允许它得到它。

机在我的域名,用户不在允许列表:

  • 浏览器没有凭据发出请求。
  • 网络应用程序自定义授权筛选器拒绝连接(挑战)。
  • 浏览器使用Windows凭据重新发出请求。
  • 网络应用无法验证请求并重定向到登录屏幕。

现在出现这个问题。

机了我的域名,用户不在允许列表:

  • 浏览器没有凭据发出请求。
  • 网络应用程序自定义授权筛选器拒绝连接(挑战)。
  • 浏览器显示一个Windows登录屏幕,并且不会重新发出请求。

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

如果我关闭auth对话框并刷新浏览器,那么应​​用程序将重定向到登录页面。

问候。

回答

1

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

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

如果域外的浏览器试图做一个“Windows登录”,它会得到一个很好的“HTTP 401未授权”页面,所以他可以反击并以传统方式执行登录。

我希望这有助于某人。

相关问题