WCF的用户名密码认证

以前我们用WebService做分布式系统的时候,认证是个麻烦的问题,通常的做法是继承一个SoapHeader,把用户名和密码放到里面,每调用一个方法都要把用户名和密码传递给服务器端来验证 ,效率相当低,代码编写相当的麻烦,而且还不安全!

WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,在跨Windows域分布的系统中,用户名密码认证还是比较常用的,要实现用户名密码认证,就必须需要X509证书,为什么呢?因为我们需要X509证书这种非对称密钥技术来实现WCF在Message传递过程中的加密和解密,要不然用户名和密码就得在网络上明文传递!详细说明就是客户端把用户名和密码用公钥加密后传递给服务器端,服务器端再用自己的私钥来解密,然后传递给相应的验证程序来实现身份验证。

当然,做个测试程序就没有必要去申请一个X509数字签名证书了,微软提供了一个makecert.exe的命令专门用来生成测试使用的X509证书的,那我们就来建立一个测试用的证书,在cmd下输入以下命令:

makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange –pe

这个命令的意思就是创建一个测试的X509证书,这个证书放在存储位置为'Localmachine'的'My'这个文件夹下,证书主题名字叫'MyServerCert',需要更多关于makecert命令的信息请参考MSDN。

证书建立好了,我们就可以编写代码了,在VS2008下建立一个解决方案并在上面建立两个Web项目,一个是'Asp.net Web 应用程序'(客户端),一个是'WCF服务应用程序'(服务器端),我们先来编写服务器端代码,首先我们要编写自己的用户名密码认证逻辑,先要在WCF项目上添加引用'System.IdentityModel'然后我们建立一个新的类文件并继承自'System.IdentityModel.Selectors.UserNamePasswordValidator',然后我们重写里面的'Validate'方法来实现用户名密码认证逻辑。代码如下;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

namespace ServerWcfService.CustomValidators
{
public class MyCustomValidator : UserNamePasswordValidator
{
/// <summary>
/// Validates the user name and password combination.
/// </summary>
/// <param name="userName">The user name.</param>
/// <param name="password">The password.</param>
public override void Validate(string userName, string password)
{
// validate arguments
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(password))
throw new ArgumentNullException("password");

// check if the user is not xiaozhuang
if (userName != "xiaozhuang" || password != "123456")
throw new SecurityTokenException("用户名或者密码错误!");
}
}

}

时间: 2024-11-18 23:17:39

WCF的用户名密码认证的相关文章

[WCF安全系列]谈谈WCF的客户端认证[用户名/密码认证]

对于基于Internet的应用,基于用户名和密码的认证方式是最为常用的,而WCF为你提供了不同模式的用户名认证方式.首先还是从用户凭证的表示说起. 一.用户名/密码认证的三种模式 基于用户名/密码的用户凭证通过类型UserNamePasswordClientCredential表示.而在ClientCredentials中,只读属性UserName表示这样一个用户凭证.你可以按照Windows凭证的方式为ChannelFactory<TChannel>或者ClientBase<TChan

[WCF安全系列]认证与凭证:用户名/密码认证与Windows认证

如果要给认证下一个定义,我个人的倾向这样的定义:认证是确定被认证方的真实身份和他或她申明(Claim)的身份是否相符的行为.认证方需要被认证方提供相应的身份证明材料,以鉴定本身的身份是否与声称的身份相符.在计算机的语言中,这里的身份证明有一个专有的名称,即"凭证(Credential)",或者用户凭证(User Credential).认证凭证(Authentication Credential). 一.凭证的属性 最好的设计就是能够尽可能的模拟现实的设计.对于安全认证来说,在现实生活

详解Nginx实战之让用户通过用户名密码认证访问web站点_nginx

有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客. 实验环境: 现在公司开通了一个内部使用网站为www1.rsyslog.org,要求所有人查看网页信息之前都必须要输入内定的用户名及密码方可浏览网页 使用nginx下虚拟主机的搭建 www1.rsyslog.org进行测试. www1.rsyslog.org 192.168.100.107

squid添加用户名密码认证

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.  -------------------------------------------------------- vim /etc/squid/squid.

[转贴][WCF Security] 4. 用户名/密码身份验证

原文:http://www.rainsts.net/article.asp?id=475   X.509 比较适合验证 "客户机" 的身份,而另外一方面,我们可能需要针对具体的 "用户" 进行验证.本文将记述基于 "用户名/密码" 方式的身份验证开发步骤. 1. 服务器数字证书 我们同样需要为服务器准备一个数字证书. D:\>makecert -r -pe -n "CN=MyServer" -ss My -sky exc

一段VB.NET代码,生成邮件,发送邮件,支持SMTP验证用户名密码.

smtp|发送邮件 可以生成邮件,可以发送邮件,稍做修改就可以写成一个com组件,在ASP里调用.以后我会整理成一个完整的. -------------------------------------------------------------------------------- '-------------------------------------------------'生成基本邮件格式(包括附件),发送邮件到SMTP服务器,'只能发送到发件人SMTP服务器(需验证),直接投递功

squid+stunnel+用户密码认证的三种玩法

没办法,应用越来越深入,就会越来越多要求. squid+stunnel+用户密码认证的场景至少以下三个,我会遇到. 1,标准玩法 在服务器上建一个SQUID,加密码认证,然后,其它人通过它上网.(不要看这是正常玩法,在一个管理后台限制登陆,而维护VPN成本大时,这个小应用很有用处的) 2,标准加密玩法 在国外搞个服务器(翻嘛,用第1种时,会有问题,因为GFW会在你想去国外就拦之),然后,将本地发到国外的请求时加密.(本来客户端安装STUNNEL,这个适合很私密的东东,但在企业内部署,就很不好推广

数据库用户名 密码和登录用户名和密码有什么区别

问题描述 数据库用户名 密码和登录用户名和密码有什么区别 数据库用户名 密码和登录用户名和密码有什么区别数据库用户名 密码和登录用户名和密码有什么区别 解决方案 yii 从数据库获取用户名.密码登录失败: 未知的用户名或错误密码.access数据库的用户名和密码的问题 解决方案二: 数据库用户名,密码就是你连接数据库的时候用的认证数据 登陆用户名密码指的什么,是数据库还是机器的 解决方案三: 这里我不知道你问的具体是哪个登录密码,如果你问的是对于数据库有不同的用户,比如 sys system h

axis2 客户端用户名密码

问题描述 axis2 客户端用户名密码 axis2客户端调用的时候需要设置用户名密码,在网上搜了下,发现了3种方式,其中方法1我调用成功了,2.3都认证失败,有没有高手帮忙解释下3面3种写法: 1. HttpTransportProperties.Authenticator auth = new Authenticator(); auth.setUsername(userName); auth.setPassword(password); stub._getServiceClient().get