惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
腾讯CDC
V
V2EX
Martin Fowler
Martin Fowler
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
博客园 - 【当耐特】
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
K
Kaspersky official blog
Security Latest
Security Latest
H
Help Net Security
博客园_首页
美团技术团队
Spread Privacy
Spread Privacy
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
G
Google Developers Blog
NISL@THU
NISL@THU
爱范儿
爱范儿
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Hacker News: Ask HN
Hacker News: Ask HN
I
InfoQ
The Cloudflare Blog
F
Full Disclosure
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium

博客园 - jiekengxu

工厂方法模式(Factory Method Pattern) 生成器模式(Builder) 抽象工厂模式(Abstract Factory Pattern) asp.net 2.0 权限树的控制(多处转载) 中小型项目的权限管理的数据关系图 简陋的会计凭证金额输入控件(再加强) Web Services Enhancements 3.0 Quick Start(四) 初识HTC asp.net 2.0 缓存(页面输出缓存) asp.net 2.0 缓存(理论篇) 智能客户端概述 简陋的会计凭证金额输入控件(加强) Web Services Enhancements 3.0 Quick Start(二) 简陋的会计凭证金额输入控件 Web Services Enhancements 3.0 Quick Start(一) 利用AJAX.net设计现在执行运算的报表 单件模式在报表中的使用 Web Service Software Factory 构架 Web Service Software Factory 入门
Web Services Enhancements 3.0 Quick Start(三)
jiekengxu · 2006-10-31 · via 博客园 - jiekengxu

       上两章主要是说明了利用Web Services Enhancements 3.0创建安全策略.现在主要是通过一个示例来较完整的讲述Web Services Enhancements 3.0构建安全Web Services
        在 June CTP 中共有六种交钥匙声明第一种是 AnonymousOverCertificateSecurity,其中 Web 服务通过其 X.509 证书对其本身进行到调用者的验证。所有调用者均是匿名的。通过使用服务器公钥交换的对称密钥提供消息级的完整性和保密性。在逻辑上,此模型与您访问喜欢的网上书店并购买某本书时所发生的情况类似。书店的客户太多了,不可能对每个客户逐一验证,但接受信用卡号和帐单接收地址是很好的方法,这样这笔交易的验证责任就转给银行了。在许多企业对企业的 Web 服务情况中,客户机和服务器都分配有证书。这种情况下,您可以从以下两种声明选择一种:CertificateMutualAuthenticationProfile 或 MutualCertificateSecurity。它们在逻辑上非常相似,客户机和服务器通过彼此出示 X.509 证书进行验证,并证明相应私钥的所有权。通过使用服务器公钥交换的对称密钥提供消息级的完整性和保密性。第一种声明依赖于现有的 WS-Security 1.0 规范,而第二种则使用 WS-Security 1.1 规范草案,其中包括一些新增功能(例如加密的 SOAP 标头)。虽然使用证书对客户机进行验证是个不错的选择,通常这样做简单但却不可行,因为这增加了维护(发放和管理客户机证书所必需的)公钥基础结构 (PKI) 的开销。通常,通过简单的用户名和密码对客户机进行验证更加合理。以下是支持此类验证的两种交钥匙声明:UsernameOverTransportSecurity 和 UsernameOverCertificateSecurity。如果要依赖 SSL 验证服务器并为通道提供完整性和保密性,则应当使用 UsernameOverTransportSecurity。而当 SSL 不适用时(例如,当有中间方并且要进行端对端验证时),UsernameOverCertificateSecurity 则十分有用。最后,如果要为支持 Kerberos 的 intranet 构建 Web 服务(现代 Windows® 域环境中的情况),KerberosSecurity 声明是非常合适的选择。由于 Kerberos 使用纯传统的加密方法来验证客户机和服务,因此与基于证书的解决方案相比,它不会为服务带来那么大的负担。但迄今为止 Windows 域环境的最大好处是支持单一登录。通过使用客户机的默认登录凭据进行验证,无需查询客户机密码。当然也不需要 PKI。服务器可以使用 Windows 组作为角色为资源访问授权或者只是模拟客户机,并让 Windows 处理访问检查。(转自http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/issues0602WSE30.mspx?mfr=true
        我们现在主要是通过usernameForCertificateSecurity作为示例
首先要介绍两个工具软件makecert.exe和certmgr.exe
makecert.exe是证书创建工具生成仅用于测试目的的 X.509 证书。它创建用于数字签名的公钥和私钥对,并将其存储在证书文件中。此工具还将密钥对与指定发行者的名称相关联,并创建一个 X.509 证书,该证书将用户指定的名称绑定到密钥对的公共部分。(http://msdn2.microsoft.com/zh-cn/library/bfsktky3.aspx详细介绍)
certmgr.exe证书管理器工具管理证书、证书信任列表 (CTL) 和证书吊销列表 (CRL)。(http://msdn2.microsoft.com/zh-cn/library/e78byta0.aspx详细介绍)
        现在我们就使用这两个工具来生成我们使用的工具

makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%WSE2QuickStartServer% -sky exchange -pe
    certmgr.exe -add -r LocalMachine -s My -c -n %WSE2QuickStartServer% -r CurrentUser -s AddressBook
    makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=%WSE2QuickStartClient% -sky exchange -pe

         查看证书
开始->运行。。。MMC
文件->添加/删除管理单元->添加->证书->添加->计算机帐户->个人->证书->WSE2QuickStartServer
文件->添加/删除管理单元->添加->证书->添加->当前用户->个人->证书->WSE2QuickStartClient
文件->添加/删除管理单元->添加->证书->添加->当前用户->其他人->证书->WSE2QuickStartServer
如图

程序实现
一、新建一个WebServie,并建立客户端需要包含用户名和密码的Usernametoken的安全令牌的安全策略(http://www.cnblogs.com/jiekeng/archive/2006/10/25/539962.html
信建一个类CustomUsernameTokenManager 继承自Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager



using System;
using System.Xml;
using System.Security.Permissions;

using Microsoft.Web.Services3.Security;
using Microsoft.Web.Services3.Security.Tokens;

namespace Microsoft.Web.Services3.QuickStart
{
    
public class CustomUsernameTokenManager : UsernameTokenManager
    
{
        
public CustomUsernameTokenManager()
        
{
        }


        
public CustomUsernameTokenManager(XmlNodeList nodes)
            : 
base(nodes)
        
{
        }

        
protected override string AuthenticateToken( UsernameToken token )
        
{
            
byte[] password = System.Text.Encoding.UTF8.GetBytes( token.Username );

            Array.Reverse( password );

            
return Convert.ToBase64String( password );
        }

    }

}

 

建立一个web服务,返回一个字符串


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

using Microsoft.Web.Services3;

using Microsoft.Web.Services3.QuickStart;

[WebService(Namespace 
= "http://stockservice.contoso.com/wse/samples/2005/10")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
[Policy(
"ServerPolicy")]
public class WSSecurityUsernameService : System.Web.Services.WebService
{
    
public WSSecurityUsernameService()
    
{
    }


  
    
public string helloWorld()
    
{
        
return "helloWorld"
    }

}

二、新建一个控制台工程,设置WSE(http://www.cnblogs.com/jiekeng/archive/2006/10/26/541210.html(使用Username客户访问方式))
添加服务引用,在代理类中大家看到public partial class WSSecurityUsernameServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol,并不是
System.Web.Services.Protocols.SoapHttpClientProtocol



using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Design;
using Microsoft.Web.Services3.Security;
using Microsoft.Web.Services3.Security.X509;
using Microsoft.Web.Services3.Security.Tokens;

using localhost;


namespace WSSecurityUsernameClient
{
    
class WSSecurityUsernameClient 
    
{
        
static void Main(string[] args)
        
{
            WSSecurityUsernameClient client 
= null;

            
try
            
{
                client 
= new WSSecurityUsernameClient();
                client.Run();
            }

            
catch (Exception ex)
            
{
            }

            Console.WriteLine( 
"" );
            Console.WriteLine(
"Press [Enter] to continue");
            Console.ReadLine();
        }


        
public void Run()
        
{

            WSSecurityUsernameServiceWse serviceProxy 
= new WSSecurityUsernameServiceWse();
            UsernameToken token 
= null;
            
bool useCorrectPassword = true
            
string username = Environment.UserName;
            
byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(username);
            Array.Reverse(passwordBytes);
            
if (useCorrectPassword)
            
{
                
string passwordEquivalent = Convert.ToBase64String(passwordBytes);
                token 
= new UsernameToken(username, passwordEquivalent);
            }

            
else
            
{
                token 
= new UsernameToken(username, "BadPassword");
            }

            serviceProxy.SetClientCredential(token);
            serviceProxy.SetPolicy(
"ClientPolicy");
            Console.WriteLine(
"Calling {0}", serviceProxy.Url);
                Console.WriteLine(
"");
                Console.WriteLine( 
"helloWorld: " + serviceProxy.helloWorld());

        }

    }

}

运行就能看到效果,
总结
我现在总有的疑惑的是客户端怎么安装证书的问题,如果有程序来安装,那BS程序就带来了部署上的问题,如果人工导入导出,那不是更郁闷,现在还在研究中,希望有人能多多帮忙啊