【问题标题】:How to pass windows credentials from an Angular client to a WebAPI?如何将 Windows 凭据从 Angular 客户端传递到 WebAPI?
【发布时间】:2018-10-14 13:50:02
【问题描述】:

我的后端是在 IIS 下运行的 ASPNet WebApi2 并使用 Windows Authentification

我有 2 个客户:

  1. 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,
        };
    
  2. 角度: 由于最终用户将使用来自非 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 客户端。

标签: angular asp.net-web-api


【解决方案1】:

你可以在这里找到图书馆:https://github.com/zorgoz/Http.BasicWindowsAuthentication

注意:它还没有“发布”,它是通过自托管而不是 IIS 集成来设计和测试的,并且从未考虑过并行使用多种身份验证方法。不过,即使不进行修改,它也可以工作。

如 cmets 中所述,您可以尝试仅使用 IIS。即使仅启用了 Windows 身份验证而未启用基本身份验证,如果 ntlm/keberos 失败,它也会退回到某种基本身份验证。浏览器将显示登录对话框。如果您传递用户名和密码,它将像常规 Windows 身份验证一样进行身份验证。 正如我所说,您可以在 ajax 请求中预先添加适当的标头,然后您应该看不到挑战。更多here。上述机制应该透明地工作 - 虽然我从未尝试过。

如果您想使用我的中间件,您必须决定将它放在管道中的哪个位置。为此使用 UseStageMarker(更多 here)。您会注意到,中间件可以提供有关登录失败原因的反馈。如果您愿意,它将在响应中添加两个标头条目,您可以在 Angular 客户端中检查并显示给用户。

【讨论】:

  • 谢谢。这应该是一个开始。
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多