c# - Window Authentication时如何控制登录对话框?
问题描述
工作流程如下
- 我在 IIS 中使用 webapi 将应用程序设置为窗口身份验证
- 使用 ajax 访问这个 webapi,
- 弹出登录对话框(window system dialog),我认为是匿名请求到IIS,然后响应401错误给客户端,浏览器弹出对话框。
- 我输入正确的域帐户,它通过了 IIS 窗口身份验证
请求转到 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时如何弹出登录对话框?谢谢。
乔伊
解决方案
实际上我是按照你下面提到的那样做的。
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 并再次打开它。
好吧,窗口身份验证并不容易使用。
谢谢。
推荐阅读
- c# - 从 ADO.Net 扩展的 OneStream XF API
- sql - SQL DISTINCT 检索同一记录的所有其他列
- react-native - `textAlign` 值在 RTL 模式下会自动反转吗?
- amazon-eks - EKS Anywhere 创建集群超时
- google-cloud-build - 谷歌云构建器图像是否已移至 Artifact Registry?
- java - 我无法解决的二维数组任务
- snowflake-cloud-data-platform - 对雪花云数据仓库中的所有表启用更改跟踪
- c - 如何仅使用 read(2) 和 write(2) 重写我的代码?
- file-upload - 我无法使用 Vue 2.6 和 Laravel 8.5(Docker 应用程序)上传图像
- vue.js - 在 Vuex Store 中正确使用 setInterval