【问题标题】:How to get ClientCertificate from the request (comparing ASP.NET and Silverlight)如何从请求中获取 ClientCertificate(比较 ASP.NET 和 Silverlight)
【发布时间】:2013-08-02 05:21:37
【问题描述】:

我有一个 Silverlight Web 应用程序,它使用启用 Silverligh 的 WCF 服务从其他 Web 服务和数据库获取数据。在前面,最终用户通过将用户名和密码写入文本框并单击按钮来登录网站。现在,最终用户拥有一张卡和一个读卡器。进入网站后必须出现认证提示。所以,我改变了我的网络服务,它使用了 HTTPS。在 IIS 中,我将 SSL 设置设置为网站要求。当然,我也创建了网站证书并将绑定证书设置为它。现在一切正常。网站和 Web 服务使用 HTTPS 打开。此外,每当进入网站时,都会显示认证提示。并且在所有证书都显示在列表中之后,用户必须选择其中之一。之后他必须输入他的密码,如果证书存储中的数据与读卡器中的卡相同,则网站正在打开。

我已阅读 this 配置 Web 服务以使用 HTTPS 的文章。

在 ASP.NET 中,我们获得了这样的证书:

X509Certificate2 cert = new X509Certificate2(Request.ClientCertificate.Certificate);
string subject = Request.ClientCertificate.Subject;

if (!Request.ClientCertificate.IsValid || Request.ClientCertificate.Count == 0)
{
     // failed
}
else
{
     Session["isRegistered"] = true;
     // success
}

但我不知道如何通过 Web 服务从请求中获取证书。 谢谢。

【问题讨论】:

    标签: c# wcf ssl silverlight-4.0 x509certificate


    【解决方案1】:

    看起来最适合您的选择是为您的服务实施自定义证书验证器。这基本上是一个从X509CertificateValidator 派生的类,然后通过配置文件是registered

    this article. 上提供了有关如何执行此操作的更完整信息

    【讨论】:

    • 验证器的目的是什么?我的问题是,我无法获得用户从认证提示中选择的证书。
    【解决方案2】:

    您可以在 System.ServiceModel.OperationContext.Current 对象中找到 WCF 请求的安全上下文,尤其是在 ServiceSecurityContext 字段中。

    【讨论】:

      【解决方案3】:

      我想,我已经解决了这个问题。我将请求对象的 ClientCertificate 属性从 Asp.net 发送到 Silverlight,如下所示:

            <form id="form1" runat="server" style="height:100%">
              <div id="silverlightControlHost">
                  <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
                    ...
                    <param name="initParams" 
      value="ClientCertificate=<%=Request.ClientCertificate.Subject %>, cc=true, m=/relative" />
                    ...
              </form>
      

      在 App.xaml.cs 中,我在 Application_startup 事件中获取值:

      private void Application_Startup(object sender, StartupEventArgs e)
              {
                  if (e.InitParams != null)
                  {
                      foreach (var item in e.InitParams)
                      {
                          this.Resources.Add(item.Key, item.Value);
      
                      }
                  }
      
                  this.RootVisual = new MainPage();
              }
      

      【讨论】:

        猜你喜欢
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 2014-06-27
        • 1970-01-01
        相关资源
        最近更新 更多