启用策略之用户令牌(UsernameToken)
实现一下用户令牌策略(UsernameToken)
这里详细的说一下:
服务端配置
(一)建立web网站(略)
(二)配置WSE
(1)在常规(general)选项卡上勾选其中的两项
(2)策略设置
在策略(Policy)选项卡中设置,这个设置很容易,勾选Enable Policy,添加策略文件:名字为ServicePolicy
步骤(上传图片比较麻烦,所以直接文字表达):
服务器策略——客户端验证方法选择Username——用户和角色这里不勾选——消息保护级别默认就行——服务器证书这里不勾选在代码中指定证书,然后选择证书——完成。
(3)用户令牌设置
这里设置比较简单,添加从UsernameTokenManager派生的类CustomUsernameTokenManager
这里给个全的:
protected override string AuthenticateToken(UsernameToken token)
{
return "111";
}
它就返回密码是:111。如果客户端的的用户令牌密码与这个不符合,那么服务就会拒绝客户访问。这个验证令牌的方法就是这个意思。它就是验证用户令牌中的密码,而用于比较的密码就是这个方法返回的字符串。
客户端配置
(1)策略设置方法与服务端设置相似,但该选择客户端的地方要选择客户端选项(这个应该容易理解吧)。
(2)请求服务时,要设置用户令牌
(3)请求服务时,不要忘记激活用户策略
下边给出一段完整的代码:
public void Test()
{
FirstInstance.WebServiceWse client =
new FirstInstance.WebServiceWse();
UsernameToken token = null;
token = new UsernameToken("qq","111");
client.SetClientCredential(token);
client.SetPolicy("ClientPolicy");
Console.WriteLine(client.HelloWorld("x"));
}
说明一下:
在这段代码中,设置的用户令牌密码为3个1。
注意:配置时要注意异常错误,这些异常错误这里不提了。只要是一步步的进行,注意其中的安全选项冲突,则没有问题。
现在对消息的保护设置为None,然后,看看令牌在soap消息中的情况,这里只给出其中的一段:
<wsse:UsernameToken>
<wsse:Username>qq</wsse:Username>
<wsse:Password Type="…PasswordDigest">
0nAwMqEiHeF+uCbMTRL0qfQG2Mo=
</wsse:Password>
<wsse:Nonce>fBduFda3nmZboNcsQDBWig==</wsse:Nonce>
<wsu:Created>2010-04-23T09:19:38Z</wsu:Created>
</wsse:UsernameToken>
这里可以看到在无消息保护级别时(消息保护选择None):用户令牌其中的两个元素:用户名和用户密码,用户名是qq,而密码以数字签名格式存在。有关签名(数字签名)及散列相关内容可见我的随笔:
http://www.cnblogs.com/jams742003/archive/2010/04/09/1708012.html
http://www.cnblogs.com/jams742003/archive/2010/04/09/1708315.html