嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
使用注意:
建立demo数据库,使用aspnet_regsql.exe建立Memmbership
一些安全场景需要证书,使用CertTool的工具生成
具体的授权时的角色和用户名字参考HostSvc、Client代码修改成测试用的后才能正常运行
一、目录结构
Common来自于Programming WCF Services[ISBN: 978-0-596-80548-7],实现WCF的声明式安全
HostSvc:不同场景的接口和服务实现,命令行承载服务
MembershipAdmin:用于操作demo数据库membership的成员操作,Asp.net Configuraion 可添加角色和用户,并使用IIS服务承载HostSvc实现的服务
Client: 使用各种服务的客户端场景
二、四种场景的区别:
Intranet
Transport保护
使用tcp绑定
windows集成的安全
Internet
只能使用Message形式的保护,需要数字证书
tcp wsHttp绑定
使用Membership进行安全认证
Anoymous
使用Message形式的保护,需要数字证书
tcp wsHttp绑定
None
消息不保护
http tcp wsHttp绑定
三、App-comment.config: 包含对于各种配置的说明
四、证书的生成:
CertTool\SetupCerts.bat生成,命令行工具从VS SDK已经拷贝过来
五、IIS中承载服务的注意:
需要把WCFServer赋予IIS的账号以权限
受信任人中加入WCFServer证书
六、证书如何管理:
1、命令行启动mmc
2、“添加、删除管理单元"加入"证书", 按照提示选择当前用户或本机
3、此时即可管理
IIS的权限操作:
在"个人/证书"下找到WCFServer,"更多操作/所有任务/管理私钥",弹出界面设置用户权限
受信任人:
在"个人/证书"下找到WCFServer,导出证书,然后在”受信息人/证书“下导入以上证书即可
七、远程机器客户端的证书问题
导出WCFServer【不要私钥】
然后在远程客户端机器上导入即可,此时的公钥可以用于消息的验证
八、IIS中承载
MembershipAdmin中加入了对应的四个.svc文件【逻辑使用的一个HostSvc中的实现】以提供WCF服务,
具体配置和HostSvc一致,当然地址不一样了
此例是把MembershipAdmin作为应程序发布到80端口的demo下
注意:
1、需要设置IIS的http和net.tcp协议支持
2、数据库demo需要能被IIS账号访问
3、WCFServer证书需要能被IIS账号访问
static void Main(string[] args) { #region Intranet下的Membership验证 ServiceHost net = new ServiceHost(typeof(IntranetMember)); net.Open(); Console.WriteLine("None Service OK, 回车继续"); Console.ReadLine(); ///MembershipAdmin的Asp.net Configuration界面界面中加入demo用户,admins角色[membership的内容] ClientCredentials usr = new ClientCredentials(); usr.UserName.UserName = "demo"; usr.UserName.Password = "demo"; WcfPrxoy<IIntranetMember> ww = new WcfPrxoy<IIntranetMember>("IntranetMember"); ww.SecureProxy(usr.UserName.UserName, usr.UserName.Password); var ei = ww.Endpoint.Address.Identity; //ww.Svc.Demo(); WcfPrxoy<IIntranetMember> ww1 = new WcfPrxoy<IIntranetMember>("IntranetMember", "net.tcp://localhost:87"); ww1.SecureProxy(usr.UserName.UserName, usr.UserName.Password); var ei1 = ww1.Endpoint.Address.Identity; ww1.Svc.Demo(); using (WcfClient<IIntranetMember> cweb = new WcfClient<IIntranetMember>(usr.UserName, "IntranetMember")) { cweb.Svc.Demo(); } net.Close(); #endregion ServiceHost none = new ServiceHost(typeof(None)); none.Open(); Console.WriteLine("None Service OK, 回车继续"); Console.ReadLine(); ///处理异常的演示,实际中这样使用以统一处理异常问题 string data = "scope"; Helpers.Action(() => { Console.WriteLine(data); using (WcfClient<INone> cno = new WcfClient<INone>(ServiceSecurity.None, "None.tcp")) { cno.Svc.Demo(); } }); bool success = Helpers.Func(()=> { Console.WriteLine(data); using (WcfClient<INone> cno = new WcfClient<INone>(ServiceSecurity.None, "None.tcp")) { cno.Svc.Demo(); } }); Console.WriteLine("{0}", success); none.Close(); //各种场景运行演示 DemoRun(); } private static void DemoRun() { ServiceHost net = new ServiceHost(typeof(Intranet)); net.Open(); Console.WriteLine("Intranet Service OK, 回车继续"); Console.ReadLine(); //所有客户端使用配置形式加载各种设置项,如Intranet等,在app.config的<client>节 //默认使用当前机器的账号 using (WcfClient<IIntranet> cnet = new WcfClient<IIntranet>(ServiceSecurity.Intranet, "Intranet")) { cnet.Svc.Demo(); cnet.Svc.Demo2(); } //显式指定账号 using (WcfClient<IIntranet> cnet = new WcfClient<IIntranet>("wu", "Administrator", "wsf", "Intranet")) { cnet.Svc.Demo(); cnet.Svc.Demo2(); } Console.WriteLine(); ServiceHost none = new ServiceHost(typeof(None)); none.Open(); Console.WriteLine("None Service OK, 回车继续"); Console.ReadLine(); using (WcfClient<INone> cno = new WcfClient<INone>(ServiceSecurity.None, "None.tcp")) { cno.Svc.Demo(); } using (WcfClient<INone> cno = new WcfClient<INone>(ServiceSecurity.None, "None.ws")) { cno.Svc.Demo(); } using (WcfClient<INone> cno = new WcfClient<INone>(ServiceSecurity.None, "None.http")) { cno.Svc.Demo(); } Console.WriteLine(); ServiceHost anoy = new ServiceHost(typeof(Anoymous)); anoy.Open(); Console.WriteLine("Anoymous Service OK, 回车继续"); Console.ReadLine(); using (WcfClient<IAnoymous> canoy = new WcfClient<IAnoymous>(ServiceSecurity.Anonymous, "Anoymous.tcp")) { canoy.Svc.Demo(); } using (WcfClient<IAnoymous> canoy = new WcfClient<IAnoymous>(ServiceSecurity.Anonymous, "Anoymous.ws")) { canoy.Svc.Demo(); } Console.WriteLine(); ServiceHost web = new ServiceHost(typeof(Internet)); web.Open(); Console.WriteLine("Internet Service OK, 回车继续"); Console.ReadLine(); ClientCredentials usr = new ClientCredentials(); usr.UserName.UserName = "demo"; usr.UserName.Password = "demo"; using (WcfClient<IInternet> cweb = new WcfClient<IInternet>(usr.UserName, "Internet.tcp")) { cweb.Svc.Demo(); } using (WcfClient<IInternet> cweb = new WcfClient<IInternet>(usr.UserName, "Internet.ws")) { cweb.Svc.Demo(); } }