如何将Windows凭据从Angular客户端传递到WebAPI?

时间:2018-05-04 06:41:50

标签: angular asp.net-web-api

我的后端是在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凭据? (我有一个登录界面,用户必须输入他的域名/密码)。

  3. 我想通过代码传递用户凭据。像typed_rest-client这样的东西。不幸的是,这个lib导致了构建错误,无法使用。

1 个答案:

答案 0 :(得分:1)

您可以在此找到图书馆:https://github.com/zorgoz/Http.BasicWindowsAuthentication

注意:它尚未“发布”,它是使用自主机设计和测试的,而不是IIS集成,并且从未考虑过并行使用多种身份验证方法。不过,它甚至可以不加修改地工作。

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

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