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

Iva*_*ono 8 asp.net-web-api angular

我的后端是在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,
        };
    
    Run Code Online (Sandbox Code Playgroud)
  2. Angular:由于最终用户将使用非Windows系统中的Angular应用程序访问WebApi后端,如何通过他/她的Windows凭据?(我有一个登录界面,用户必须输入他的域名/密码).

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

Zor*_*goZ 1

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

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

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

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