无法从调用 TLS 身份验证 Web API 从控制台应用程序转移到 ASP.NET MVC IIS 托管应用程序
Can't move from calling TLS authenticated Web API from console application to ASP.NET MVC IIS hosted application
我学习了有关如何使用 OWIN 和 Katana 创建 TLS 安全 Web API 的教程。当我使用控制台应用程序作为客户端访问 Web API 时一切正常。
但是,我想做的是访问 IIS 中托管的另一个 ASP.NET MVC 站点中的 API。当我将代码移动到基本控制器时,出现错误
The request was aborted: Could not create SSL/TLS secure channel
我看过其他一些讨论配置的帖子 System.Net.ServicePointManager.SecurityProtocol
所以我试过了,但它似乎没有任何改变。
我使用 Windows Server 2012 R2 和目标 .NET 4.6 在 IIS 中托管了两个站点。
在使用客户端证书但安装在 LocalMachine 下的控制台应用程序中运行的代码:
static void Main(string[] args)
{
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(X509.LocalMachine.My.SubjectDistinguishedName.Find("CN=client").First());
var client = new HttpClient(handler)
{
BaseAddress = new Uri("https://admin.web/api/")
};
var response = client.GetAsync("identity").Result;
response.EnsureSuccessStatusCode();
var content = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(JArray.Parse(content));
}
移动到 ASP.NET MVC 站点时基本控制器中出现故障的代码:
using System.Web.Mvc;
using System.Net.Http;
using System;
using Thinktecture.IdentityModel;
using System.Linq;
using System.Net;
namespace DataClientWeb.Controllers
{
public class DefaultController : Controller
{
// GET: Default
public ActionResult Index()
{
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(
X509.LocalMachine.My.SubjectDistinguishedName.Find("CN=client").First());
var client = new HttpClient(handler)
{
BaseAddress = new Uri("https://admin.web/api/")
};
var response = client.GetAsync("identity").Result;
response.EnsureSuccessStatusCode();
return View();
}
}
}
我之前没有使用客户端证书进行身份验证来保护 Web 应用程序,所以我可能只是在这里遗漏了一些简单的东西。感谢任何指点。
IIS 运行 中的 Web 应用程序在应用程序池身份帐户下无权访问存储在本地机器存储中的私钥。您应该明确授予对应用程序池身份帐户的私钥读取权限。
此外,您管理HttpClient实例的方式也有缺陷,因为它可能会导致内存泄漏。有关详细信息,请参阅 HttpClient class' remarks。
我学习了有关如何使用 OWIN 和 Katana 创建 TLS 安全 Web API 的教程。当我使用控制台应用程序作为客户端访问 Web API 时一切正常。
但是,我想做的是访问 IIS 中托管的另一个 ASP.NET MVC 站点中的 API。当我将代码移动到基本控制器时,出现错误
The request was aborted: Could not create SSL/TLS secure channel
我看过其他一些讨论配置的帖子 System.Net.ServicePointManager.SecurityProtocol
所以我试过了,但它似乎没有任何改变。
我使用 Windows Server 2012 R2 和目标 .NET 4.6 在 IIS 中托管了两个站点。
在使用客户端证书但安装在 LocalMachine 下的控制台应用程序中运行的代码:
static void Main(string[] args)
{
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(X509.LocalMachine.My.SubjectDistinguishedName.Find("CN=client").First());
var client = new HttpClient(handler)
{
BaseAddress = new Uri("https://admin.web/api/")
};
var response = client.GetAsync("identity").Result;
response.EnsureSuccessStatusCode();
var content = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(JArray.Parse(content));
}
移动到 ASP.NET MVC 站点时基本控制器中出现故障的代码:
using System.Web.Mvc;
using System.Net.Http;
using System;
using Thinktecture.IdentityModel;
using System.Linq;
using System.Net;
namespace DataClientWeb.Controllers
{
public class DefaultController : Controller
{
// GET: Default
public ActionResult Index()
{
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(
X509.LocalMachine.My.SubjectDistinguishedName.Find("CN=client").First());
var client = new HttpClient(handler)
{
BaseAddress = new Uri("https://admin.web/api/")
};
var response = client.GetAsync("identity").Result;
response.EnsureSuccessStatusCode();
return View();
}
}
}
我之前没有使用客户端证书进行身份验证来保护 Web 应用程序,所以我可能只是在这里遗漏了一些简单的东西。感谢任何指点。
IIS 运行 中的 Web 应用程序在应用程序池身份帐户下无权访问存储在本地机器存储中的私钥。您应该明确授予对应用程序池身份帐户的私钥读取权限。
此外,您管理HttpClient实例的方式也有缺陷,因为它可能会导致内存泄漏。有关详细信息,请参阅 HttpClient class' remarks。