为什么X509Certificate2Collection在IIS中不起作用?

时间:2017-10-16 17:58:25

标签: c# asp.net-mvc x509certificate2

我编写了一个ASP.NET MVC应用程序。在应用程序中,我编写了一个名为GetClientCertificateCollection()的简单方法。该方法应该只返回当前用户的客户端证书。当我在VisualStudio 2013 / IIS Express [调试模式]中执行此代码时,逻辑工作正常,我可以毫无问题地处理用户的X509证书[我也检索服务器的证书,但我&#39 ;写的可以忽略它们,只通过有效的用户证书处理]。

不幸的是,当我将我的解决方案部署到Web服务器上的IIS实例时,该方法什么都不返回;字面上0证书。

我已经研究并尝试过一些建议,但我找不到吸烟枪是不成功的。

我的IIS配置如下: 1.站点作为"默认网站"的子目录托管。 2.绑定 - 端口443启用SSL证书。 2.身份验证 - 全部禁用。 3. SSL设置 - 需要SSL /要求。

我希望有人可以帮助我指出正确的方向。在此先感谢您的帮助。

public static X509Certificate2Collection GetClientCertificateCollection()
{
    X509Store UserStore = new X509Store(StoreName.My, StoreLocation.CurrentUser)
    try
    {
        UserStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        X509Certficate2Colllection certificatesInStore = UserStore.Certificates;
        return certificatesInStore;
    }
    catch (Exception ex)
    {
        throw;
    }
    finally
    {
        UserStore.Close
    }
}

2 个答案:

答案 0 :(得分:2)

我几乎100%确定您没有任何证书,因为您没有将它们放入应用池的身份资料中。

换句话说,您错误地假设您的应用程序在完全相同的配置文件(您的配置文件)下在IIS上运行,而实际上应用程序池具有另一个不同的标识集。

您必须检查应用程序池的设置,找到池运行的标识,以此身份登录,访问其证书存储区并将证书放在那里。如果您的应用程序池使用APP POOL标识池,则可能会出现问题,您只能从此池中以身份身份登录。在这种情况下,您必须切换到共享证书存储(计算机存储),它是由任何标识访问的单个证书存储区。

答案 1 :(得分:0)

自从发布这个问题以来我学到了很多东西。当我最初发布这个问题时,我忽略了一些相当简单的障碍,我希望我的答案可以帮助那些可能会遇到同样问题的人。

  1. 提取浏览器证书的正确方法是使用HttpContext.Current.Request.ClientCertificate。使用X509Store是一种不正确的方法。
  2. 如果您在使用HttpContext时收到的证书不存在,请调查您拨打电话的位置。如果使用MVC应用程序,则无法从global.asax.cs中的Application_Start进行此调用。相反,将Application_BeginRequest方法添加到global.asax.cs类并从此位置调用HttpContext。