获取Web服务的客户端应用程序名称

时间:2014-02-20 17:40:32

标签: c# web-services security

我正在用C#更新用VS2012编写的Web服务应用程序,我想在其中获取客户端应用程序名称。

我是否可以通过系统调用来获取此值?

最初,在Web服务应用程序中有以下代码行:

string ApplicationID = 
       System.ServiceModel.ServiceSecurityContext.Current.PrimaryIdentity.Name;

此.Name值返回用户的名称,我需要客户端应用程序名称。

如何安全地获取客户的应用程序名称?

  • 更新 似乎ClientCredential类可用于设置用户名,如:

    service1.ClientCredentials.UserName.UserName =" ClientTestApp";

在客户端应用程序中,您可以使用以下命令访问Web服务应用程序中的用户名:

 string TestAppName = System.ServiceModel.ServiceSecurityContext.Current.PrimaryIdentity.Name;

如何配置端点的绑定?

更新

举一个例子来说明我在下面的评论中的意思......

客户申请:

        Service1.ClientCredentials.UserName.UserName = "ClientAppName";

        try
        {
            Service1.Method1(ProfileID, OrderID);
        }
        catch (Exception ex)
        {
            string Error = ex.Message;
        }

WEB服务方法:

 public void Method1(long ProfileID, int OrderID)
    {
        //The ApplicationID will be "ClientAppName"
        string ApplicationID = ServiceSecurityContext.Current.PrimaryIdentity.Name;
        try
        {
            //CHeck the ApplicationID and do stuff...
        }
    }

配置文件 绑定可能必须包含UserName的凭据。但我似乎无法获得正确的配置以使其发挥作用。

我所描述的可能吗?

更新

我已经阅读了很多关于使用这些安全元素和属性设置配置文件的内容。但我还在学习。所以我提前道歉,提出一些基本问题。

我在Web服务应用程序中获得了分配给ApplicationID的值:

string ApplicationID = ServiceSecurityContext.Current.PrimaryIdentity.Name;

使用此绑定配置:

<wsHttpBinding>
      <binding name="ServiceEndpoint"  closeTimeout="00:01:00">
        <security mode="Message">
        </security> 
      </binding>
</wsHttpBinding>

但是,值存储在

ServiceSecurityContext.Current.PrimaryIdentity.Name;

是我的SQL Server 2012 Management Studio中的Windows身份验证的用户名。

根据文档,ServiceSecurityContext类应返回以下内容: &#34;表示远程方的安全上下文。在客户端上,表示服务标识,并在服务上表示客户端标识。&#34;

如何获取此用户名值?

无论如何我可以用另一个值设置它吗?

通过使用wsHttpBinding和Message属性,这是否意味着它正在使用SOAP消息安全性? (正文已加密并签名。)

尝试另一种方法 如果我设置ClientCredentials.UserName.UserName =&#34; TestClient&#34;              ClientCredentials.UserName.Password =&#34;一些密码&#34; 在客户端测试应用程序中。

添加UserNamePasswordValidator类并覆盖Validate()方法。在此方法中,它会检查数据库中的表以获取用户名和密码。

我使用wsHttpBinding的当前配置文件是:

<wsHttpBinding>
  <binding name="PaymentSecureServiceEndpoint"  closeTimeout="00:01:00">
    <security mode="Message">
      <message clientCredentialType="UserName"/>
    </security> 
  </binding>
</wsHttpBinding>

当我尝试更新服务引用时,出现错误:   &#39;未提供服务证书。在ServerCredentials中指定服务证书。&#39;

有没有办法在不提供服务证书的情况下使用validate()方法? ServerCredentials是否必须处于服务级别,是否可以处于端点级别? 这会将PrimaryIdentity.Name值设置为我在客户端应用程序中设置的UserName吗?

谢谢...一如既往。

添加自签名证书

我的自签名证书的名称是:TestCert。 我放证书的地点是:             控制台根/证书(本地计算机)/个人/证书。

这是web.config文件中定义的服务行为:

 <behavior name="SecureBehavior">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" 
                                customUserNamePasswordValidatorType="Service1.Service1UsernamePasswordValidator, Service1"/>
        <serviceCertificate findValue="TestCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
      </serviceCredentials>
    </behavior>

我收到错误,它无法找到我的x.509证书。 我在serviceCertificate属性上做了什么错误?

在更新服务参考时获得客户接受服务证书的更新 即使我尝试使用序列号,我仍然会收到错误,如果找不到证书。以下是我的错误的详细信息:

我在证书&#39;文件夹中有自签名证书。在个人&#39;文件夹下。这个友好名称&#39;是TestCert&#39;。序列号是一个开头的十六进制数字。 7f 79 8a a7 ...&#39;。证书在我的本地机器上。

我尝试过的属性:

storeLocation =&#34; LOCALMACHINE&#34; - 我没有改变这个。证书在我的本地机器上,并且所有文档都说明当它是,它应该是它的值。

STORENAME =&#34;我&#34; - 证书在&#39;个人&#39;证书中的文件夹&#39;夹。这应该与“我的”相对应。我想这称它为“个人”是太直观了。

x509FindType =&#34; FindBySubjectName&#34; - 我把这个值保持为&#39; ..主题名称&#39;当'findValue&#39;是证书的名称。这个友好名称&#39;证书是&#39; TestCert&#39;。 “友好名称”&#39;没有选项。但是我已经尝试过了......杰出的名字&#39;,&#39; By ... TemplateName&#39;。我还将选项设置为&#39; FindBySerialNumber&#39;

findValue =&#34;&#34; - 我使用了证书名称&#39; TestCert&#39;和&#39; CN = TestCert&#39;我尝试复制序列号并设置x509FindType选项以按SerialNumber搜索但我收到错误:&#39;无效的十六进制字符串格式&#39;。

为什么这么难?我的个人文件夹中有2个证书,一个是localhost,另一个是&#39; TestCert&#39;。找到它应该不难。

问题是它是自签名证书吗?它不是x509证书吗?如何检查它是否,它不在属性列表中。

难怪安全性如此困难!文档很糟糕,按照说明操作不起作用。

1 个答案:

答案 0 :(得分:1)

我问的原因是:客户端只使用Web服务 - 这意味着除了请求之外,客户端和服务之间没有连接。所以你要么通过查询字符串发送客户端名称(必要时加密)或通过会话变量发送(很像表格帖子),我可能是错的但我不认为客户端和网络服务之间可能有紧密的联系这样 - 它会违背Web服务是松散耦合服务的想法。