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

发布于 2024-12-03 04:38:45 字数 844 浏览 3 评论 0原文

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

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

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

当机器位于我的域内时,它效果很好。

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

  • 浏览器发出没有凭据的请求。
  • Web 应用程序自定义授权过滤器拒绝连接(挑战)。
  • 浏览器使用 Windows 凭据重新发出请求。
  • Web 应用程序对 Windows 用户进行身份验证并允许其获取。

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

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

现在问题来了。

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

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

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

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

问候。

I have a web application that allows anonymous access and windows authentication.

Basically, the app try to auto-login users by windows authentication if the windows user is in a user list in the application, otherwise it shows the login screen. If no credential is provided, the app then shows a login screen where the user could login using a application internal user.

As far as I know, Windows Authentication is a challenging protocol, so I have to return an Unauthorized in order to force the browser to send the credentials.

It works great when are machines inside my domain.

Machine in my domain which the user is in the list:

  • browser issue request with no credentials.
  • web app custom authorize filter reject the connection (challenge).
  • browser reissue the request with the windows credentials.
  • web app authenticates that windows user and allow it get it.

Machine in my domain which the user is not in the allowed list:

  • browser issue request with no credentials.
  • web app custom authorize filter reject the connection (challenge).
  • browser reissue the request with the windows credentials.
  • web app fails to authenticate the request and redirect to the login screen.

Now comes the problem.

Machine out of my domain which the user is not in the allowed list:

  • browser issue request with no credentials.
  • web app custom authorize filter reject the connection (challenge).
  • browser shows a windows login screen, and it doesn't reissue the request.

Why the request is not reissued when the server is returning unauthorized?

If I close the auth dialog, and refresh the browser, then the app redirects to the login page.

Regards.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

意中人 2024-12-10 04:38:45

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

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

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

我希望这对某人有帮助。

Well, if the computer is outside the server domain, the browser won't try to send the credentials (as it would be probably pointless in terms of Windows authentication) and it will prompt for credentials after the first HTTP 401.

The solution is enable Anonymous authentication and Windows authentication together, and let the LogOn page be accessed anonymously. In the LogOn page place the login controls, and a button named for example "Windows Login" that navigates to an action method named "WindowsAuth". In that action method, return HttpUnauthorizedResult if not Request.LogonUserIdentity.IsAuthenticated, and redirects to Home otherwise, that will force the browser to send the Windows credentials.

If a browser outside of the domain tries to do a "Windows Login", it will get a nice "HTTP 401 Unauthorized" page, so he can hit back and perform login in the traditional way.

I hope this helps somebody.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文