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

8

我的后端是在IIS下运行的ASPNet WebApi2,使用Windows身份验证

我有两个客户端:

  1. WinForms: Passing the credentials is simple. I do the following:

        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. Angular: As the end-user will access the WebApi backend using the Angular app from non-Windows systems, how can I pass his/her windows credentials? (I have a login screen where the user must enter his domain/name and password).

我希望能够通过代码传递用户凭据。类似于typed_rest-client这样的方式。不幸的是,这个库会导致构建错误,无法使用。


这个链接有帮助吗?https://spikesapps.wordpress.com/2017/08/04/how-to-implement-windows-authentication-in-an-angular-4-3-1-application-with-a-stand-alone-web-api/ - Tarun Lalwani
这与您相关吗?https://dev59.com/VGw15IYBdhLWcg3wO5MH - ForestG
1
在谈论Windows身份验证时,传递用户名和密码并不常见。Windows客户端将使用NTLM或Kerberos。如果您传递un/pwd,则不会发生任何事情。我需要相同的功能,并编写了一个OWIN中间件,通过在服务器端登录用户将基本身份验证标头转换为Windows身份,同时保持最低的开销。这允许任何可以添加基本身份验证标头以传递凭据的客户端 - 包括浏览器或ajax调用。这对您有帮助吗? - ZorgoZ
1
在Windows客户端上,UseDefaultCredentials将触发Negotiate,导致使用ntlm或kerberos。它不会传递用户名和密码。您可以使用https://github.com/erlandranvinge/ntlm.js/来模拟ntlm握手-但不是kerberos,因为这涉及第三方。这是另一个选择。在Katana中,您不能在同一管道中使用ntlm和基本身份验证,但IIS可以处理此问题,因此您可以同时为Angular客户端使用我的中间件和ntlm的Windows客户端。 - ZorgoZ
实际上,如果ntlm失败,IIS可以提供基本身份验证的回退。您可以尝试在前面添加基本身份验证标头。可能不需要任何额外的中间件就能工作。但请记住,我说的是基本身份验证,而不是表单身份验证。因此,它将与ajax调用一起工作,但不会直接工作。我的中间件可以轻松转换为处理基于表单的身份验证,而不是基本身份验证。如果您不想为所有请求发送凭据(如Windows客户端中所做的那样),则必须与基于cookie的身份验证相结合。 - ZorgoZ
显示剩余2条评论
1个回答

1

在这里你可以找到该库:https://github.com/zorgoz/Http.BasicWindowsAuthentication

注意:它尚未“发布”,并且是使用自托管设计和测试的,而不是IIS集成,并且从未考虑过同时具有多种身份验证方法。尽管如此,即使没有修改,它仍然可以工作。

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

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

谢谢。这应该是一个开始。 - Ivan-Mark Debono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接