首页 > 解决方案 > Window Authentication时如何控制登录对话框?

问题描述

工作流程如下

  1. 我在 IIS 中使用 webapi 将应用程序设置为窗口身份验证
  2. 使用 ajax 访问这个 webapi,
  3. 弹出登录对话框(window system dialog),我认为是匿名请求到IIS,然后响应401错误给客户端,浏览器弹出对话框。
  4. 我输入正确的域帐户,它通过了 IIS 窗口身份验证
  5. 请求转到 Web API,我展开“AuthorizationFilterAttribute”以验证它是否具有指定的角色。但这个帐户没有。

    一个。如果我也将其响应为 401 状态。结果是登录对话框一次又一次地弹出。但期望是对话消失并进入错误页面。
    湾。如果我用错误消息向客户端响应 200 状态。我无法再次弹出对话框。我猜它是由标题“Persistent-Auth:true”引起的

我从互联网上搜索并获得以下信息。

当同时满足以下两个条件时,浏览器会弹出登录提示:

HTTP 状态为 4xx WWW-Authenticate 标头存在于响应中

因此,我尝试删除“WWW-Authenticate”,但从未成功。只要我设置

“HttpResponseMessage”的“StatusCode = System.Net.HttpStatusCode.Unauthorized”,客户端浏览器总是得到“WWW-Authenticate”。似乎 IIS 中的窗口身份验证模块涵盖了这些信息。

//responseMessage.Content.Headers.Remove("WWW-Authenticate"); //responseMessage.Content.Headers.Remove("Persistent-Auth");

所以,我的问题是

如何删除“WWW-Authenticate”或“Persistent-Auth”?或者

状态为200时如何弹出登录对话框?谢谢。

乔伊

标签: c#authenticationiiswindowwebapi

解决方案


实际上我是按照你下面提到的那样做的。

HttpResponseMessage responseMessage = new HttpResponseMessage()
{
      Content = new StringContent(JsonConvert.SerializeObject(message)),
      //StatusCode = System.Net.HttpStatusCode.Forbidden
      StatusCode = System.Net.HttpStatusCode.Unauthorized
};

但是有一个不好的用户习惯。当它向客户端响应未经授权时。登录对话框将闪烁一次,然后再次出现登录对话框。

预期是输入用户帐户和密码并单击确定按钮,然后服务器端响应未经授权给客户端。然后登录对话框消失并显示错误页面告诉用户没有权限。单击登录按钮以再次显示登录对话框。

以上是问题1。

问题2,如果我使用“Forbidden”而不是Unauthorized,那么我可以实现上述预期,但登录对话框将不再显示。

问题3,如果我输入了错误的账号或密码,那么它会响应statuscode为0,并且登录对话框也无法再次显示。即使我按 f5 刷新它。除非我关闭 chrome 并再次打开它。

好吧,窗口身份验证并不容易使用。

谢谢。


推荐阅读