如何从请求中获取ClientCertificate(比较ASP.NET和Silverlight)

时间:2013-08-02 05:21:38

标签: c# wcf ssl silverlight-4.0 x509certificate

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

我已阅读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 Service从请求中获取证书。 感谢。

3 个答案:

答案 0 :(得分:1)

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

有关如何在this article.

上执行此操作的更完整信息

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为,我已经解决了这个问题。我将请求对象的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();
        }