java wcf 未提供用户名_WCF 之UserName身份验证全记录

本篇不是介绍WCF的基础知识,而专门讨论基于UserName的身份验证方式。

关于WCF的基础知识,如果有不清楚的,请参考下面的链接

我现在用一个实录的方式,介绍一下UserName的身份验证

1. 准备一个证书。这个证书将用来做消息的加密。

我们可以通过SDK工具makecert创建一个测试证书,如下图

makecert -r -pe -n "CN=WCFCert" -ss My -sky exchange

b76cfa027d0a2ec02ec2a8ffd2872675.png

创建成功之后,我们可以在证书管理器中看到我们的证书

dbbde88422df697551aee015e895a883.png

ee0d6e20e013fa121d6e2a36b038fc8a.png

2. 创建WCF服务库

adea227895f5605e2bd0b217160a36df.png

修改名称,点击“确定”后创建的项目已经包含了一个简单的接口和服务

f1f48e683f8fc2c8234ce72371a9eb79.png99791a8391ae84e9c94581fab52c786f.png528a848e99a295d5d8a3f9ffc0918c2e.png

3. 测试该服务

通过VS2008提供的工具,我们可以很方便地进行服务的测试工作。方法是:直接按F5

25ad92f1554800f472b7bdeece23a9ae.png

双击“GetData”

93c461b9b6281555684b8a45591e2d35.png

在“值”中输入一个数值,点击“调用”

fcae20898bba3552c5314217e67c7c10.png

点击“确定”后,在测试客户端的右下部分,会看到有关的响应

b137a89aabe5e68695c2a0b0a2f1bbbd.png

测试结果表示该服务是工作正常的。

4.创建一个客户端来使用该服务

我们通过创建一个Windows Forms程序来作为客户端。

169a49da2e9c4e251d3d34eb4a02d645.png

项目创建好之后,我们需要为该项目添加一个服务引用

66d599ddfff6d66911daa23c822ff132.png

点击“添加服务引用”

9b4431ffe4b0f7ad454ed3cae7aa6f02.png

点击“发现”按钮

a01ccbf360405447a8ef32da51725661.png

点击“确定”按钮

dcdb566a917c425fe67e29811e077bb4.png

5. 编写代码访问该服务

private void btGetData_Click(object sender, EventArgs e)

{

TestService.Service1Client proxy = new Client.TestService.Service1Client();

MessageBox.Show(proxy.GetData(2000));

}

6. 将客户端程序设置为启动项目,按F5调试

b975d088c4048159b7b1d37088bb5ec0.png

7. 现在的服务能正常工作了,但没有做任何的身份验证。这不能满足我们的需求。我们首先从服务端下手,进行设置

dd48b00d187bc81e90f22e6e51254018.png

选择中WCFServiceLib中的app.config文件,然后右键菜单中点击“编辑WCF配置”

6cc9cf00f40639a4607e3232ae5689a3.png

我们可以看到Service1这个服务,会有两个EndPoint(终结点)。其中第一个是标准的请求的终结点,而第二个(mex)是基于元数据的发现。

我们点击第一个终结点(wsHttpBinding)下面的Binding configuration右边的 “单击可创建”

c184e7217ff1b6c57f30beca87ae9c93.png

如果有兴趣,可以逐一了解每个属性。我们这里就不一一介绍了。因为此篇blog的目的是解决安全性问题

点击窗口顶部的“安全性”

0cde8a587fec318e840722fbfe3c1743.png

我们修改两个选项如下。即:在消息级别使用基于UserName的身份验证,而在传输级别不使用验证

1f2b517bcca011b76b0969e426a78fcf.png

接下来,我们还要配置服务行为。通过依次展开“高级”=》“服务行为”=》WCFServiceLib.Service1Behavier。我们能看到如下的界面

c4cda10e9bf8ca79698f9b55edbc1b40.png

点击“添加”按钮

36c057d22f88ec5d989552c558e831a1.png

选择“serviceCredentials”,点击“添加”

0bffd8fa8e0aa973064a2b7fd23d6a4d.png

双击“serviceCredentials”

affe0859723c07c6a6fbcad611d6fbaf.png

这个窗口中主要要设置的是UserNamePasswordValidationMode。这里有三个选择,如下图所示

c590c9c6f0668bdfef615c51c71f2602.png Windows :基于windows的用户名和密码

MembershipProvider :基于成员管理提供程序

Custom : 自定义的身份验证提供程序

我们先用Windows验证方式。

cbe76c27b76082ee60baf3c1b058aad7.png

我们还需要设置服务端证书的信息,如下

f8037408c17d34662f4be2077e8e71f0.png

设置完之后,我们选择“文件”=》“保存”后,回到Visual Studio中的服务项目中的app.config

name="WCFServiceLib.Service1">

contract="WCFServiceLib.IService1">

x509FindType="FindBySubjectName" />

8. 完成服务端的配置后,我们先直接运行客户端程序。看看会发生什么情况

1a99dd3c63c52af9c78046328e8c91fb.png

我们收到了一个异常消息。很显然,因为服务端已经启用了更加严格的安全性,客户端也需要有相应的设置才行

9. 对客户端进行配置

0f5db27969f6810c90a8b4d73ec7e1a0.png

我们发现这个终结点有一个相应的配置。接下来对其进行查看,确定MessageClientCredentialType也是Windows

8910c2e4442fcd1882fac05287e8f188.png

接下来,我们还需要定义终结点行为

e067975674c02bb8c2f982ddca47049f.png

点击“新建终结点行为配置”

799891518bfa5e146c77b5d96bae169c.png

点击“添加”

4cbf3690081afd32e3e4185c80dd0b4d.png

选择“clientCredentials”.依次展开clientCredentials=>serviceCertificate=>defaultcertificate,并进行如下的设置。这里的证书需要与服务器端匹配,因为它将对消息进行加密。

a322c1a2a51c8106dea4496468042134.png

选择“身份验证”

1bf23da012fc85cbb94258c0d644743b.png

【注意】一定要把CertificateValidationMode设置为None。因为我们现在使用的是测试证书

然后,回到终结点中,将终结点与行为进行关联。

467c8757b368c0d1b89a421af5d6b823.png

并且,在“标识”页面进行如下的设置

5c90a55a8405d46e9437cc36e11d04c1.png

完成如上的配置后,保存,退出该工具。

openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"

bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"

maxBufferPoolSize="524288" maxReceivedMessageSize="65536"

messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"

allowCookies="false">

maxBytesPerRead="4096" maxNameTableCharCount="16384" />

enabled="false" />

realm="" />

algorithmSuite="Default" establishSecurityContext="true" />

behaviorConfiguration="NewBehavior" binding="wsHttpBinding"

bindingConfiguration="WSHttpBinding_IService1" contract="TestService.IService1"

name="WSHttpBinding_IService1">

findValue="WCFCert" />

9. 修改客户端代码,在调用服务之前设置客户端的凭据

7390ce22143efd394dfebc2945727f49.png

我们很高兴地看到,这样做了之后,就可以看到结果了

e250a8a6191f4bcbb25cd5b6274af0b2.png

10. 进一步的扩展。

上面的过程我们实现了对于WCF服务,使用基于windows的username验证的方式。但如果我们想更加有灵活性.首先看我们能不能使用自定义的代码来进行验证呢?

11. 实现自定义的身份验证器

375e22dec571562c5d244050bfd56c17.png

我们在服务项目中添加一个新的类

同时,我们还需要添加两个引用

176c2fe82a7bb87c291a5172747f04d0.png

然后,编写该类型

9b7e7f1fdcb9479dca8d32e8798bad12.png

12. 在服务器端指定使用该验证器

d0ece09eb9b727abd3eb2f8f5b9da5e3.png

13. 客户端掉用调试

【注意】客户端无需任何更改。我们还是像下面这样提供用户名和密码

9c39e1a82d2c8dd9cb21170a9aa9b14d.png

因为这个用户名和密码是正确的,所以能正确返回。

反之,如果我们修改一下密码,例如改成password1,则会发生一个异常

db986aecfa1cf2a1246d94af8ca70501.png

这样就实现了自定义的身份验证工作。

14. 最后,其实我们还可以做得更加简单一些。就是不编写专门的用户密码验证器,而是直接使用ASP.NET 2.0新增加的所谓MemberShip的功能。(关于该功能,以及其配套的数据库,你可能需要参考其他的资料,这里不做介绍)

我们首先在服务端配置文件中,添加如下的设置

然后,继续配置服务的配置文件

d05f5b360447b0b7fd540bc2fe200e4e.png

同样,保存好配置后,客户端亦无须任何修改。直接调试一下看看

00754f0d513b40fd534aaa283507c2ac.png

我们在数据库中有一个用户叫wcf,它的密码就是pass@word

所以,通过如下的客户端代码就可以成功实现验证

98c12d401d53f4ab2a64f655f0485a67.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值