我对使用 IIS 和 HttpListener 进行 Windows 身份验证有疑问
我有以下设置(全部安装在同一个 Windows 8.1 框中。没有外部通信)。所有请求都以http://本地主机/......
互联网信息服务
ASP.Net Web 应用程序身份验证
Anonymous: Disabled
Windows Authentication: Enabled
.Net httpListener
作为服务运行,以本地系统帐户运行并启用 Windows 身份验证
this.httpListener = new HttpListener();
this.httpListener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;
UWP 应用程序 (Windows 8.1)
UWP 应用程序就像一个 Web 浏览器。它具有 WebView 控件来查看网页内容。
已启用以下功能
- 企业认证
- 互联网(客户端)
- 地点
- 专用网络(客户端和服务器)
问题
当我从 uwp 应用导航到 IIS Web 应用时,它会通过弹出 Windows 对话框要求输入凭据。从用户体验的角度来看,这很烦人,因为用户使用相同的凭据登录。但是当我访问 HttpListener 时,它会正确进行身份验证,不需要任何凭据。
我还通过 Fiddler 检查了请求。初始请求是相同的,但对于 IIS 请求的后续步骤,它不断要求 NTLM。
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate oYHOMIHLoAMKAQGhDAYKKwYBBAGCNwICC........
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
初始请求/响应
互联网信息服务
要求
GET http://localhost/webapp_net/ HTTP/1.1
Accept-Encoding: gzip, deflate
Host: localhost
Connection: Keep-Alive
回复
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST
Date: Tue, 20 Nov 2018 21:37:24 GMT
Content-Length: 6016
Proxy-Support: Session-Based-Authentication
HttpListener
要求
GET http://localhost/appman HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-NZ
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; WebView/2.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: localhost
回复
HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Tue, 20 Nov 2018 21:37:18 GMT
Proxy-Support: Session-Based-Authentication
有人有类似的经历或对此有解释吗?
答案1
我对此有一个解释,您正在尝试使用协商/集成 Windows 身份验证机制实现单点登录 (SSO)。这本身无法与本地安全机构一起使用。协商尝试首先使用 Kerberos 身份验证,如果未配置 Kerberos,则返回到 NTLM。Kerberos 是一种 Windows 身份验证机制,需要密钥分发中心,该中心由 Microsoft 的 Active Directory 为加入域的计算机提供。使用集成 Windows 身份验证的 IIS 服务器的 SSO 只能使用 Kerberos 协议来实现。NTLM 是一种质询-响应身份验证机制,它将在每次请求时提示输入凭据。
资料来源:
https://docs.microsoft.com/en-us/windows-server/security/windows-authentication/windows-logon-scenarios https://msdn.microsoft.com/en-us/library/cc247021.aspx