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

本文关键字:ASP 比较 NET Silverlight ClientCertificate 请求 获取 | 更新日期: 2023-09-27 18:26:15

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

我已经阅读了这篇关于将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服务的请求中获得证书。谢谢

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

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

关于如何做到这一点,本文提供了更完整的信息。

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

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