Tag: wcf security

如何从客户端请求获取X509Certificate

我有一个使用证书保护的网络服务。 现在,我想通过查看证书指纹来识别客户端。 这意味着我的服务上有一些指纹列表,这些指纹链接到某个用户。 实际上,我的第一个问题(有点偏离主题)是:这是一个好方法还是我还应该引入一些用户名密码构造? 第二个问题是:我如何获得客户端用于连接到Web服务的证书,以便我可以在服务端读取指纹。 我确实读了很多关于它的内容(比如这篇文章: 如何从Web服务中的客户端发送X509Certificate? )但找不到答案。 我没有HTTPContext,所以这不是一个选项。 在上面提到的post中提到了Context.Request.ClientCertificate.Certificate但我想它们也意味着HTTPContext 。 另外,将到web.config也不是一个选项。

缺少“管理私人钥匙”选项

我正在使用Windows 2008R2下IIS 7.5上托管的Transport Security开发WCF服务。 我有一个在IIS 7.5中生成的证书,该证书存储在Local文件夹中。 当我使用BasicHttpBinding或WSHttpBinding与Transport Security时 – 一切正常。 但当我将其更改为NetTcp时,我得到一个例外: CryptographicException ‘Keyset does not exist’. 经过一段谷歌搜索后,我发现问题可能是因为我的NETSERVICE IIS帐户没有预先设置我的证书的私钥。 解决方案是通过右键单击我的证书并选择“MANAGE PRIVATE KEYS”选项来设置MMC中的访问权限。 但是在选择菜单中没有这样的选项! 证书是在管理员帐户下创建的,我打开它 – 它说,它有私钥。 我做错了什么?

在C#中以编程方式创建WCF客户端的标头(wsse)部分

如何以编程方式在app #config中创建app.config服务设置的以下部分: someusername somepassword 我设法从c#生成绑定部分(上面没有包含)和端点部分。 我无法创建标题部分。 出现的错误是:(这是因为当我从c#生成所有内容时,我没有标题部分) 此服务需要 ,缺少该服务。 header部分很重要,好像我从配置中排除它并使用config运行代码它也会产生上述错误。 我不想使用web.config / app.config。 我必须从C#运行所有东西。 (上面的app.config工作正常,但我想通过c#做同样的事情) 注意:以下更新是基于以下提供的解决方案请通过以下解决方案的评论,以获得更好的理解 更新1 :(首先以编程方式使用BasicHttpBinding) BasicHttpBinding binding = new BasicHttpBinding(); binding.Name = “Contact”; binding.CloseTimeout = TimeSpan.FromMinutes(1); binding.OpenTimeout = TimeSpan.FromMinutes(1); binding.ReceiveTimeout = TimeSpan.FromMinutes(10); binding.SendTimeout = TimeSpan.FromMinutes(1); binding.AllowCookies = false; binding.BypassProxyOnLocal = false; binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; binding.MaxBufferSize = 524288; binding.MaxBufferPoolSize = 524288; binding.MaxReceivedMessageSize = […]

识别WCF客户端ID

我有一个WCF Web服务,它公开了几种业务方法。 我还有两个客户端 – 一个asp.net GUI和一个数据迁移应用程序,它们都连接到wcf后端以调用各种业务事务。 我需要我的后端能够识别和区分哪个wcf客户端调用了一些变体逻辑。 有没有办法让我的WCF服务能够识别连接到它的客户端? 还有一种方法可以使用签名密钥来防止客户端欺骗他们的身份吗?

如何以编程方式为WCF服务创建自签名证书?

我有一个自托管的WCF服务器作为本地系统帐户下的Windows服务运行。 我正在尝试以编程方式在c#中创建自签名证书,以便使用消息级别安全性与net.tcp端点一起使用。 我使用以下代码,它非常基于如何使用C#创建自签名证书中的接受答案? 试图解决我的问题的一些小变化。 public static X509Certificate2 CreateSelfSignedCertificate(string subjectName, TimeSpan expirationLength) { // create DN for subject and issuer var dn = new CX500DistinguishedName(); dn.Encode(“CN=” + subjectName, X500NameFlags.XCN_CERT_NAME_STR_NONE); CX509PrivateKey privateKey = new CX509PrivateKey(); privateKey.ProviderName = “Microsoft Strong Cryptographic Provider”; privateKey.Length = 1024; privateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE; privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_DECRYPT_FLAG | X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_KEY_AGREEMENT_FLAG; privateKey.MachineContext = true; privateKey.ExportPolicy = […]

使用从WCF服务到Java Webservice的X.509证书对SOAP消息进行签名

这是我在网上的第一个问题。 希望它有意义。 我在网上看到了几个与此问题相关的博客,我尝试了一些没有成功的想法。 这是我的情况: 我有一个Web应用程序调用WCF Web服务,然后调用Java Web服务。 它们都在不同的服务器上。 WCF Web服务与java Web服务之间的调用未通过https,因为证书足以识别调用者(因此消息安全性)。 Java Web服务(黑盒子) Java Web服务需要收到已签名的消息,并按以下方式工作: 在处理每个请求之前,处理程序拦截所有传入的消息并执行以下validation规则: 1.邮件是否包含安全标头 2.邮件是否包含正确的安全标头ID 3.邮件是否已正确签名 4.邮件是否包含KeyInfo x.509证书 5.证书是否来自可信CA-配置 6.证书是否有效(未过期,已撤销) 7.证书是否包含正确的策略OID 确认所有这些步骤后,可以处理该消息,如果任何步骤失败,则将返回soap消息exception。 SOAP安全标头应根据xxx … w3.org/TR/SOAP-dsig/数字签名规范进行validation。 最完整的描述可以在这里找到xxx … ibm.com/developerworks/webservices/library/ws-security.html这篇IBM文章列出了每个WS-Security标头的详细信息,另外还提供了一个示例签名的SOAP消息。 签署SOAP消息时,还必须将x.509证书添加到消息KeyInfo中,这是证书validation所必需的。 SOAP请求应该是这样的: soe1PnaGXVGrsauC61JSHD+uqGw= Y9SRPQ9TcDu+GazO3LFwodEdhaA= jBX/8XkY2aCte7qgXEp1sbNWmQcK/90iVL58sAvwYAEcBABGzOk2agxR0HvWrNa6ixkocAQ205lggwOxnxZJvoVozVYAAjcLtayPBOUYrnSEBFrwKWP/vxgvUDRIdXeIuw5GLY87NrTQMm1Ehf/HvMX9hTBJn4Nm8RdDiUmPcIo= MIIEbZCCA1WgAwIBAgIES1XpMjANBgkqhkiG9w0BAQUFADBYMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFzAVBgoJkiaJk/IsZAEZFgdlbnRydXN0MRIwEAYDVQQDEwllbnRydXN0U00xEjAQBgNVBAMTCWVudHJ1c3RDQTAeFw0xMDA0MjIxMDQ4MDBaFw0xMzA0MjIxMTE4MDBaMGoxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDEXMBUGCgmSJomT8ixkARkWB2VudHJ1c3QxEjAQBgNVBAMTCWVudHJ1c3RTTTESMBAGA1UEAxMJZW50cnVzdENBMRAwDgYDVQQDEwdSYnMgUmJzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMf88L2JjLPG1hNmTA/KBiC53WVwS2WU9Jh3lC1Rob6RMzOojomZ/dNrvSRB6nzWeXJpZXwik4XFrsAq24By2SZpLTO4p8Vcq71mTAfDu33cnO49Au2pwNvcMn5qIKBk1Xx+oVb4fzK9ncTRu7bW46HsIYth+qkGhbI2JEHwr/zwIDAQABo4IBrzCCAaswCwYDVR0PBAQDAgeAMCsGA1UdEAQkMCKADzIwMTAwNDIyMTA0ODAwWoEPMjAxMjA1MjgxNTE4MDBaMCMGA1UdIAQcMBowCwYJYIZIAYb6awoEMAsGCSqGSIb2fQdLAzAbBgNVHQkEFDASMBAGCSqGSIb2fQdEHTEDAgEBMIHGBgNVHR8Egb4wgbswb6BtoGukaTBnMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFzAVBgoJkiaJk/IsZAEZFgdlbnRydXN0MRIwEAYDVQQDEwllbnRydXN0U00xEjAQBgNVBAMTCWVudHJ1c3RDQTENMAsGA1UEAxMEQ1JMMTBIoEagRIZCZmlsZTovLy8vTVNJREhVLTQ0NUE0RkVFL0NSTC9lbnRydXN0Y2FfZW50cnVzdHNtX2xvY2FsX2NybGZpbGUuY3JsMB8GA1UdIwQYMBaAFBvSL6cPz8L5shubV58yf0pczKzuMB0GA1UdDgQWBBT1/j6OSS8FTjwqluvew16sv7h+VzAJBgNVHRMEAjAAMBkGCSqGSIb2fQdBAAQMMAobBFY4LjADAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQBXxRIA4HUvGSw4L+4uaR51pY4ISjUQWo2Fh7FYBMt29NsKCTdur1OWVVdndt1yjXP4yWXxoAhHtvZL+XNALUFlR2HAWiXuL1nRcxHkB98N5gPqQzW/lJk9cLtL4hVp28EiEpgmKT3I3NP2Pdb2G5MMOdvQ/GFb2y6OwblR8ViPQ8B2aHWzXMrH+0qadPAuBhXyAohwb+mMuYT/ms6xpGi1NMYuYMf6XONz9GkZgnGnMwa+9CCQws1HNz8WYHtmFIxLsVuEWc/0a1vg4IYX1Ds/ttyhJGTVXOSJSkBz8kRyj1pNBDdc1KeG8M++O8m8VgRTJvYaPc7NMiclISukGpea 0061020051 WCF Web服务 我有一个服务器证书(来自可靠CA的p7b格式),我安装在我的WCF Web服务工作站(dev)使用mmc Certificate Snap-in(目前cert在受信任的发布者中)。 我不认为我需要在Java服务器上使用另一个证书,因为响应应该是明确的(既没有签名也没有加密)。 我对这个证书仍然有点困惑 – 一般都是证书 – 因为它似乎只持有一个公钥。 这是我的测试项目的app.config: <!– –> 当我运行一个简单的测试时: WebAS […]

使用WCF的身份validation服务

我有一个自定义MembershipProvider,如下所示。 它根据Active Directoryvalidation用户名和密码。 我想把它作为“身份validation服务”。 即使客户端使用表单身份validation或Windows身份validation,这也应该有效。 有一个WCF“人力资源服务”,它提供员工信息。 “HR UI”网站正在使用“HR Service”WCF服务。 现在,我们需要确保在访问“HR服务”操作之前,使用“身份validation服务”对使用“HR服务”的任何客户端进行身份validation。 如果客户端应用程序经过一次身份validation,则下次不应再次validation(直到应用程序关闭)。 当打开客户端应用程序的新实例时,需要从头开始进行身份validation。 我们如何实现它? 我们是否有任何代码样本用于端到端流程演示? 注意:我应该能够使用自托管服务进行测试。 注意:客户端可以是任何平台(例如Java)。 namespace LijosCustomValidation { public sealed class LijoMembershipProvider : MembershipProvider { public override bool ValidateUser(string username, string password) { bool isValid = true; //my logic to validate the user name and password return isValid; } //other implementations of Abstract Methods […]