我有一个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从请求中获取证书。 感谢。
答案 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();
}