【发布时间】:2018-10-14 13:50:02
【问题描述】:
我的后端是在 IIS 下运行的 ASPNet WebApi2 并使用 Windows Authentification。
我有 2 个客户:
-
WinForms: 传递凭据很简单。我执行以下操作:
var credentialCache = new CredentialCache(); credentialCache.Add(new Uri(uri.GetLeftPart(UriPartial.Authority)), "NTLM", credentials); WebRequestHandler handler = new WebRequestHandler() { AuthenticationLevel = AuthenticationLevel.MutualAuthRequested, Credentials = credentialCache, PreAuthenticate = true, UseDefaultCredentials = false }; client = new HttpClient(handler, true) { BaseAddress = uri, }; 角度: 由于最终用户将使用来自非 Windows 系统的 Angular 应用程序访问 WebApi 后端,我如何传递他/她的 Windows 凭据? (我有一个登录屏幕,用户必须在其中输入他的域名/名称和密码)。
我想通过代码传递用户凭据。像typed_rest-client 这样的东西。不幸的是,这个库导致构建错误并且无法使用。
【问题讨论】:
-
@TarunLalwani 不幸的是没有。我想通过代码传递用户凭据。
-
在谈到 Windows 身份验证时,通常不传递用户名和密码。 Windows 客户端将使用 ntlm 或 kerberos。如果你通过 un/pwd 什么都不会发生。我需要同样的东西,我编写了一个 owin 中间件,它通过在服务器端登录用户将基本身份验证标头转换为 Windows 身份,并且开销尽可能低。这允许任何可以添加基本身份验证标头的客户端传递凭据 - 包括浏览器或 ajax 调用。这对您有帮助吗?
-
在 Windows 客户端上,UseDefaultCredentials 将触发协商,从而产生 ntlm 或 kerberos。它不会传递用户名和密码。您可以使用 github.com/erlandranvinge/ntlm.js 来模拟 ntlm 握手 - 但不是 kerberos,因为这涉及第三方。这是另一种选择。在 Katana 中,您不能在同一管道中使用 ntlm 和基本身份验证,但 IIS 会处理此问题,因此您可以将我的中间件用于 Angular 客户端,将 ntlm 用于 Windows 客户端。