使用客户端证书从另一个 Web API 调用 Web API

4

场景:用户通过AngularJS客户端与名为“Gateway”的WebApi交互。'Gateway'类似于门面或代理,因此从用户到'Gateway'的所有请求都将转发到另一个WebApi。

安全细节:'Gateway' WebApi和所有其他WebApi都放置在IIS中,具有HTTPS绑定,并且SSL客户端证书选项为“接受”。因此,用户将向IIS提供有效的客户端证书,并在验证后,请求将由WebApi处理。

问题:当“Gateway” WebApi接收到请求时,客户端证书显示在请求对象中。然后,我使用HttpClient将此请求转发到另一个WebApi。但是当另一个WebApi端点收到请求时,不再附加任何客户端证书。

以下是请求转发的代码片段:

var request = Request; // income request from angularjs

var handler = new WebRequestHandler();
handler.ClientCertificates.Add(request.GetClientCertificate()); // setting up client certificate from user's request
using (var httpClient = new HttpClient(handler))
{
    request.RequestUri = *chaning request address here*;
    var response = await httpClient.SendAsync(request);
    return ResponseMessage(response);
}

注意:如果我直接尝试访问另一个WebApi,则客户端证书会如预期一样出现。 如果我通过“Gateway”尝试访问,则在“Gateway”请求中也会呈现客户端证书,但成功附加并发送请求后,另一个WebApi不会收到任何附加的证书。
有什么想法吗? 谢谢。

另一个 WebApi 需要获取在“网关”上终端用户所持有的证书(用于身份验证)吗?或者仅在“网关”上对用户进行身份验证并使用一个服务帐户来对“网关”进行身份验证以访问“另一个WebApi”是否可行? - tgolisch
基本上,我有一个单独的Web API端点,负责处理客户端证书。最好只让网关Web API处理转发请求,而不涉及其他事情。谢谢。 - Dzmitry
好的。这很重要,因为对于你的问题有两个完全不同的答案,这取决于你是否需要将身份验证传递到下一个服务器。 - tgolisch
1个回答

0
在您的网关服务器上,您需要将身份验证密钥导入到“机器”证书存储(MMC.exe,添加快照“证书”,计算机帐户,“证书-个人-证书”,导入)中。
授予账户使用IIS池的权限(对于auth证书)。 (右键单击证书,所有任务,管理私钥。 添加,高级,位置= [机器名称],立即查找,(可能是)网络服务,读取)。

在您的web.config(在您的网关服务器上),检查您的system.serviceModel / behaviors / endpointBehaviors / behavior / clientCredentials / clientCertificate。 确保属性:storeLoction =“LocalMachine”,以使用来自机器密钥存储的证书。


将会有许多客户端和许多不同的客户端证书,每个证书都包含用户身份详细信息。因此,为了澄清,如果没有将所有可能的传入证书存储在网关MMC存储中,就无法将附带客户端证书的请求从网关转发到另一个Web API。 - Dzmitry
这就是我之前提出问题的原因。虽然可以将客户端凭据传递给API服务器,但这是完全不同的答案和配置。 - tgolisch
tgolisch,您能否描述一下可能的解决方案,因为我还没有成功过? - Dzmitry
我还没有为另一种解决方案准备演示,但我相当确定它涉及两个服务器之间的Kerberos信任,并在网关服务器上进行模拟。 - tgolisch

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