我遵循了有關如何使用 OWIN 和 Katana 創建 TLS 安全 Web API 的教程。當我使用控制臺應用程式作為客戶端訪問 Web API 時,一切正常。
但是,我想做的是訪問 IIS 中托管的另一個 ASP.NET MVC 站點中的 API。當我將代碼移動到基本控制器中時,出現錯誤
請求被中止:無法創建 SSL/TLS 安全通道
我看過其他一些討論配置的帖子,System.Net.ServicePointManager.SecurityProtocol所以我試過了,但它似乎沒有改變任何東西。
我使用 Windows Server 2012 R2 將這兩個站點托管在 IIS 中,并以 .NET 4.6 為目標。
使用客戶端證書在控制臺應用程式中作業但安裝在 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 應用程式,所以我可能只是在這里遺漏了一些簡單的東西。任何指標表示贊賞。
uj5u.com熱心網友回復:
IIS 中的 Web 應用程式在應用程式池身份帳戶下運行,該身份帳戶無權訪問存盤在本地計算機存盤中的私鑰。您應該明確授予應用程式池身份帳戶的私鑰讀取權限。
另外,你管理 HttpClient 實體的方式是有缺陷的,因為它可能會導致記憶體泄漏。有關詳細資訊,請參閱HttpClient 類的備注。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465247.html
標籤:asp.net-mvc ssl 欧文 x509证书 网页API
