繁体   English   中英

Windows身份验证Web API未经授权-多台服务器

[英]Windows Authentication Web API Unauthorized - Multiple Servers

场景

我有两个应用程序在同一内部网络中的不同服务器上运行。

服务器1包含一个WebAPI MVC项目。

服务器2包含一个MVC Web应用程序,该应用程序调用服务器1上的API。

这两个应用程序都使用Windows身份验证工作。

当我通过IIS和Visual Studio在本地运行它们时,代码运行良好。

在服务器上运行时,出现以下错误:

远程服务器返回错误:(401)未经授权。

以下是来自Fiddler的请求。

GET http://server1/..../..../GetTest HTTP/1.1
Host: server 1
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Negotiate YIIHIgYGKwYBBQUCoIIHFjCCBxK.....
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cookie: ASP.NET_SessionId=gffyzdgub41op0diygy5lyv2

以下是API请求代码

public string GetTest()
{

    string sURL = "http://server2/.../api/test?value=JERONIMO";
    WebRequest wrGETURL = WebRequest.Create(sURL);

    wrGETURL.Credentials = CredentialCache.DefaultCredentials;
    var result = "";
    using (Stream objStream = wrGETURL.GetResponse().GetResponseStream()) {
        using(StreamReader objReader = new StreamReader(objStream)) {

            string sLine = "";
            int i = 0;

            while (sLine != null) {
                i++;
                sLine = objReader.ReadLine();
                if (sLine != null) result += sLine;
            }
        }
    }

    return result;
 }

谢谢您的帮助。

当使用称为double hop的 Windows身份验证时,这是一个众所周知的问题。

针对此类问题的2种解决方案:

  • Server2上的应用程序池标识从ApplicationPoolIdentity更改为服务帐户,以便我们可以调用Server1 此解决方案不会在用户在Server2上调用api时传播上下文(您仍然可以通过向Server1方法发送参数化信息来进行调用以筛选出数据来进行传播)。

  • 实现约束委派,以允许Server2将用户身份转发到Server1 除非您对此有严格的安全要求,否则我将采用第一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM