使用OWIN

时间:2017-11-30 19:42:35

标签: asp.net-mvc owin azure-web-sites client-certificates owin-middleware

如果您使用Azure Web Apps托管Web应用程序(让它成为ASP.NET MVC Web应用程序),则do not have the possibility设置Azure Web App后面的IIS以通过HTTPS接受客户端证书连接。我的应用程序有一些Web API端点只有在用户拥有允许指纹的正确证书时才能访问。但是,我还有其他端点(当然还有网站),无需客户端证书即可访问。所以在我的情况下,唯一的方法是接受客户证书。

我不确定,但如果我知道,我仍然可以使用OWIN获取客户端证书,而IIS中的SSL设置设置为忽略。如果我使用OWIN并通过OWIN环境,我可以看到一个名为 ssl.LoadClientCertAsync 的密钥。

我正在实现第三方服务将调用的端点,因此我无法控制请求的内容。我知道有一个 ssl.ClientCertificate 密钥,类型为 X509Certificate ,但在我的情况下,这个密钥不存在。

我找到了一些关于使用此 ssl.LoadClientCertAsync 键来获取证书的C#解决方案,例如Katana CheckClientCertificate 方法或此解决方案C# Corner article。在我可以在网络中找到的每个解决方案中,作者将此类型作为Func<Task>获取,然后通过例如使用await运算符来调用此任务。

var certLoader = context.Get<Func<Task>>("ssl.LoadClientCertAsync");
if (certLoader != null)
{
     await certLoader();
...

之后,他们使用 ssl.ClientCertificate 键检索证书。

    var asyncCert = context.Get<X509Certificate>("ssl.ClientCertificate");

在此示例中,我的 asyncCert 变量始终为null。 OWIN上下文中没有任何 ssl.ClientCertificate 键。我曾尝试使用 X509Certificate2 而不是 X509Certificate ,但我仍然无效。

我的问题是,在使用OWIN默认SSL设置为Ignore的情况下,是否可以在Azure网站中获取客户端证书?如果是,为什么我不能使用 ssl.LoadClientCertAsync 键获取证书?

1 个答案:

答案 0 :(得分:1)

根据您的描述,我已经创建了我的ASP.NET MVC Web应用程序,用于在OWIN中使用客户端证书来检查此问题。以下代码可以在我的本地工作:

if (Request.GetOwinContext().Environment.Keys.Contains(_owinClientCertKey))
{
    X509Certificate2 clientCert = Request.GetOwinContext().Get<X509Certificate2>(_owinClientCertKey);
    return Json(new { Thumbprint = clientCert.Thumbprint, Issuer = clientCert.Issuer }, JsonRequestBehavior.AllowGet);
}
else
    return Content("There's no client certificate attached to the request.");

对于设置为接受的SSL设置,我可以选择证书或取消弹出窗口以选择证书。

enter image description here

AFAIK,我们可以通过将clientCertEnabled设置为true来启用客户端证书身份验证,此设置等同于IIS中的SSL Settings Require选项。

正如How To Configure TLS Mutual Authentication for Web App所述,关于从Web应用程序访问客户端证书:

  

如果您使用的是ASP.NET并将应用程序配置为使用客户端证书身份验证,则证书将通过HttpRequest.ClientCertificate属性提供。对于其他应用程序堆栈,客户端证书将通过X-ARR-ClientCert请求标头中的base64编码值在您的应用程序中提供。

  

我的问题是,在默认的SSL设置是否使用OWIN忽略时,是否可以在Azure网站中获取客户端证书?

AFAIK,目前客户端证书的SSL设置目前仅支持IgnoreRequire。在Azure应用程序上托管您的Web应用程序时,对于使用客户端证书身份验证访问您的azure Web应用程序的客户端用户,他们可以在向您的Azure应用程序发送请求时将证书指定为base64编码值作为自定义请求标头,然后如果存在证书自定义请求标头,您可以尝试检索标头并验证证书。详细信息,您可以按照此sample

此外,您可以使用Azure VM或Azure Cloud Service而不是azure Web应用程序,此时您可以完全控制IIS中的SSL设置。