zoukankan      html  css  js  c++  java
  • wse说谈(2)——策略,匿名用户策略

    wse视图工具中,其中的两个选项卡:策略(Policy)和安全(Secury

    1 策略是对安全的控制

    2 安全选项卡中可以设置对于安全控制的策略组件的设置,例如用户令牌管理,证书管理

     

    策略分两种,服务端和客户端。在添加策略文件时,验证项(用户的授权)可以有四种选择:

    Anonymous(匿名用户):这种类型不要求有客户凭证

    Username(用户):这种类型要求客户端传递一个用户令牌凭证,凭证中包含用户名和用户密码

    Certifacate(证书):这种类型要求客户端传递一个证书令牌,令牌中包含x.509证书

    Windowswindows):这种类型要求客户传递kerberos令牌,其中包括一个windows标识。

     

    soap消息进行保护的类型也有四种:

    None(无):由SSL传输提供soap消息的保护。WSE不强求

    Sign-Only(只签名):只对soap消息进行签名

    Sign and Encrypt(签名并加密):对soap消息进行签名且加密

    Sign,Encrypt,Encrypt Signature(签名,加密,加密签名):对soap消息进行签名,且对soap包体和签名进行加密。

     

    在程序中以MessageProtectionOrder枚举来表示:

    ·EncryptBeforeSign:在签名前加密soap消息

    ·SignBeforeEncrypt:加密前要签名,但签名不加密

    ·SignBeforeEncryptAndEncryptSignature:加密前要签名,然后签名也要加密

    Wse配置工具是对config文件的界面操作工具,在xml中,属性值与这个枚举值相同:

    messageProtectionOrder="SignBeforeEncrypt"

     

    现在说说策略断言(Policy Assertion 

    策略断言定义了一组在服务器和客户进行soap消息交换的要求。例如一个策略断言可能会指定一个用来对在服务器和客户之间进行的soap消息交换进行加密和签名的令牌类型。为了指定安全要求,添加为策略断言添加一个或多个turnkey或自定义的安全断言。策略断言,通过xml元素来声明,例如像下边这个例子中的<anonymousForCertificateSecurity>元素。

    <anonymousForCertificateSecurity>

          <serviceToken></serviceToken>

          <protection>

           <reques/>

          </protection>

    </anonymousForCertificateSecurity>

     

    (一)不启用策略

    不启用策略时,就是不配置WSEPolicy部分。只是对ws启用WSE增强。这个很简单。

    ·服务端:在可视工具上的常规选项卡上勾选2项(如果不是网站项目,则不能添加soap protocol factory

    ·客户端(例如类库项目):在可视工具常规选项卡上勾选1项,这项的主要作用就是添加对Microsoft.Web.Services3的引用。

     

    在客户端使用时,使用带WSE后辍的代理类实例来实现对服务的请求:

    FirstInstance.WebServiceWse client = new FirstInstance.WebServiceWse();

     

    (二)启用策略之匿名用户

    匿名用户anonymous不要求有客户凭证,而对消息的保护如果要有签名或加密,须启用证书,有关证书的相关内容请见:

    http://www.cnblogs.com/jams742003/archive/2010/04/12/1710124.html

    http://www.cnblogs.com/jams742003/archive/2010/04/20/1716253.html

     

    这里启用匿名用户:

    ·服务端策略选项卡上添加服务端策略,添加完毕后,在服务上以修饰标签的形式启用策略。

    ·客户端启用相同的策略,但策略名不同。在应用时,可在代码中启用策略

    ·在消息保护项有3项可选择,所以这里需要一张证书

     

    服务端:

    1 策略选项卡——添加策略——策略名(ServerPolicy——匿名——签名——选择证书——完成

    2 在服务类添加修饰以启用策略

    [Microsoft.Web.Services3.Policy("ServerPolicy")]

    public class WebService : System.Web.Services.WebService

     

    客户端:

    1策略选项卡——添加策略——策略名(ClientPolicy——匿名——签名——选择证书——完成

    2 在代码中启用策略:

    client.SetPolicy("ClientPolicy");

     

    这里给出一段启用匿名用户策略且对消息进行签名的soap包部分:

    <Signature

    xmlns="http://www.w3.org/2000/09/xmldsig#">

    <SignedInfo>

    <ds:CanonicalizationMethod

    Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"

    xmlns:ds="http://www.w3.org/2000/09/xmldsig#" />

    <SignatureMethod

    Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1" />

    <Reference URI="#Id-c7c03d5c-6e4b-493e-b3e8-c50ba9c27088">

    <Transforms>

    <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />

    </Transforms>

    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />

    <DigestValue>1tzz6zotjDSBNQf0UhyrqfA2G6I=</DigestValue>

    ……

    在匿名用户策略下,消息保护可选择3种方式:

    Sign-Only(只签名)

    Sign and Encrypt(签名并加密)

    Sign,Encrypt,Encrypt Signature

     

    在上段例子中用的是第一种。在包中的包体部分可以看到:

    <soap:Body>

    <HelloWorld xmlns="http://tempuri.org/">

                 <strName>Songjiang</strName>

          </HelloWorld>

      </soap:Body>

     

    Web方法传入参数是明文形式。这个部分由策略断言设置,在原设置中,请求部分的包体加密属性为false

    encryptBody="false"

    现在改为要求加密包体,然后看包体中的参数部分:

    <soap:Body>

      <xenc>

        <xenc:EncryptionMethod

        Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />

        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

          <wsse:SecurityTokenReference>

            <wsse:Reference

            URI="#SecurityToken-2bf9dfb3-9f7d-42ac-9bfc-e12919fb2202"

            ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" />

          </wsse:SecurityTokenReference>

        </KeyInfo>

        <xenc:CipherData>

          <xenc:CipherValue>

    Ig7MdF2oZZS625taru1b/RwH5IDePxBUwIWDw

    0Lw2Y/E8HetOG64sdpX6J7bZeLXf8XWA3TmyC

    gCmqBgQJn/UD73ZlVdAufVv3pzTAeew62GcnH

    Esj3AZOYNcDI90wVZUZ4Dm7LMn4T9K6SBJO7qgw==

          </xenc:CipherValue>

        </xenc:CipherData>

        </xenc:EncryptedData>

      </soap:Body>

     

    可以看到包体中的明文已经变成了密文CipherValue

    从这段代码来看,它的加密方法是AES256CBC格式。关于更多对称加密的内容可见:

    http://www.cnblogs.com/jams742003/archive/2010/04/07/1706471.html

     

    对于soap消息的加密保护可在策略断言中设置,下面给出一段完整的策略断言:

    <policy name="ClientPolicy">

    <anonymousForCertificateSecurity

    establishSecurityContext="false"

    renewExpiredSecurityContext="true"

    requireSignatureConfirmation="false"

    messageProtectionOrder="SignBeforeEncrypt"

    requireDerivedKeys="true" ttlInSeconds="300">

    <serviceToken>

    <x509 storeLocation="CurrentUser"

    storeName="AddressBook"

    findValue="CN=soapEncrypt"

    findType="FindBySubjectDistinguishedName" />

    </serviceToken>

    <protection>

    <request

    signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"

    encryptBody="true" />

    <response

    signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"

    encryptBody="false" />

    <fault

    signatureOptions="IncludeAddressing,IncludeTimestamp,IncludeSoapBody"

    encryptBody="false" />

    </protection>

    </anonymousForCertificateSecurity>

    </policy>

    策略断言可以使用 turnkey断言或自定义。

    turnkey安全断言的作用:

    ·消息级别或传输级别的安全

    ·证明客户或服务或两者的安全凭证

    ·保护soap消息的安全凭证

    它有很多种类,下边列举一下:

    ·<anonymousForCertificateSecurity>

    ·<kerberosSecurity>

    ·<mutualCertificate10>

    ·<mutualCertificate11>

    ·<usernameOverTransportSecurity>

    ·<usernameForCertificateSecurity>

  • 相关阅读:
    Bugs及解决方案列表
    CSS技巧和经验
    我的越权之道
    密码找回逻辑漏洞总结
    业务安全漏洞挖掘归纳总结【转载】
    User Agent
    影响网站页面打开速度的三个因素
    iframe 透明
    ie对行高line-height的诡异解释
    A标记点击后去掉虚线
  • 原文地址:https://www.cnblogs.com/jams742003/p/1718649.html
Copyright © 2011-2022 走看看