【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

1.x509证书制作(略)

2.直接贴代码

----------------------------------------------------------------------服务端-------------------------------------------------------------------------------------------

WCF服务

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.ServiceModel.Web;
 7 using System.Text;
 8 
 9 namespace WcfService自定义授权
10 {
11     
12     public class Service1 : IService1
13     {
14         public string GetData(int value)
15         {
16             return string.Format("You entered: {0}", value);
17         }
18 
19         public int GetNumber(int A, int B)
20         {
21             return A + B;
22         }
23 
24         public string GetStr(string str)
25         {
26             return "GetStr:" + str;
27         }
28     }
29 
30     [ServiceContract]
31     public interface IService1
32     {
33         [OperationContract]
34         string GetData(int value);
35         [OperationContract]
36         int GetNumber(int A, int B);
37         [OperationContract]
38         string GetStr(string str);
39     }
40 }
WCF服务

 

安全验证

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Xml;
 6 
 7 namespace WcfService自定义授权
 8 {
 9     /// <summary>
10     /// 实现自定义用户名密码校验
11     /// </summary>
12     public class MyCustomUserNameValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
13     {
14         public override void Validate(string userName, string password)
15         {
16             if (userName == null || password == null)
17             {
18                 throw new ArgumentNullException("用户名或密码不能为空");
19             }
20             if (!HelpCheckUserNamePassWord(userName, password))//(userName != "admin" && userName != "admin2")
21             {
22                 throw new ArgumentNullException("用户名或密码不正确");
23             }
24         }
25 
26         #region 私有方法
27         /// <summary>
28         /// 校验用户名密码
29         /// </summary>
30         /// <param name="userName">用户名</param>
31         /// <param name="passWord">密码</param>
32         /// <returns></returns>
33         private bool HelpCheckUserNamePassWord(string userName, string passWord)
34         {
35             List<string> list = new List<string>();
36             XmlDocument doc = new XmlDocument();
37             doc.Load(AppDomain.CurrentDomain.BaseDirectory + "SafetyVerification\\UserRoleConfig.xml");
38             XmlNodeList nodes = doc.SelectNodes("UserRoleConfig/User");
39             foreach (XmlNode node in nodes)
40             {
41                 string name = String.Empty;//用户名
42                 string pwd = String.Empty;//密码
43                 foreach (XmlAttribute xa in node.Attributes)//校验用户名密码
44                 {
45                     if (xa.Name == "Name" && xa.Value == userName)
46                         name = xa.Value;
47                     else if (xa.Name == "PassWord" && xa.Value == passWord)
48                         pwd = xa.Value;
49                     if (!String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(pwd))
50                         return true;
51                 }
52             }
53             return false;
54         }
55         #endregion
56     }
57 }
校验用户名和密码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.ServiceModel;
 6 
 7 namespace WcfService自定义授权
 8 {
 9     /// <summary>
10     /// 提供对服务操作的授权访问检查
11     /// </summary>
12     public class CustomServiceAuthorizationManager : System.ServiceModel.ServiceAuthorizationManager
13     {
14         protected override bool CheckAccessCore(OperationContext operationContext)
15         {
16             //请求调用的资源url
17             string action = operationContext.RequestContext.RequestMessage.Headers.Action;
18             Console.ForegroundColor = ConsoleColor.Red;
19             Console.ForegroundColor = ConsoleColor.White;
20             //ClaimSet 表示与某个实体关联的声明的集合。
21             //获取与授权策略关联的声明集
22             foreach (System.IdentityModel.Claims.ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
23             {
24                 if (cs.Issuer == System.IdentityModel.Claims.ClaimSet.System)
25                 {
26                     foreach (System.IdentityModel.Claims.Claim claim in cs.FindClaims("http://tempuri.org/", System.IdentityModel.Claims.Rights.PossessProperty))
27                     {
28                         //校验是否有调用权限
29                         if (claim.Resource.ToString() == action)
30                         {
31                             return true;//通过
32                         }
33                         else
34                         {
35                             string url = action.Substring(0, action.LastIndexOf('/'));
36                             if (claim.Resource.ToString() == url + "/all")//可以调用该服务下所有的方法
37                                 return true;
38                         }
39                         
40                     }
41                 }
42             }
43             return false;//不通过
44         }
45     }
46 }
提供对服务操作的授权访问检查
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Xml;
  6 
  7 namespace WcfService自定义授权
  8 {
  9     /// <summary>
 10     /// 查询用户可调用的资源
 11     /// 定义一组用于对用户进行授权的规则
 12     /// </summary>
 13     public class CustomAuthorizationPolicy : System.IdentityModel.Policy.IAuthorizationPolicy
 14     {
 15         string id = string.Empty;
 16         public CustomAuthorizationPolicy()
 17         {
 18             id = new Guid().ToString();
 19         }
 20         public System.IdentityModel.Claims.ClaimSet Issuer
 21         {
 22             get { return System.IdentityModel.Claims.ClaimSet.System; }
 23         }
 24         public string Id
 25         {
 26             get { return id; }
 27         }
 28         /// <summary>
 29         /// 查询用户可调用的资源
 30         /// </summary>
 31         /// <param name="evaluationContext"></param>
 32         /// <param name="state"></param>
 33         /// <returns></returns>
 34         public bool Evaluate(System.IdentityModel.Policy.EvaluationContext evaluationContext, ref object state)
 35         {
 36             bool flag = false;
 37             bool r_state = false;
 38             if (state == null) { state = r_state; } else { r_state = Convert.ToBoolean(state); }
 39             if (!r_state)
 40             {
 41                 List<System.IdentityModel.Claims.Claim> claims = new List<System.IdentityModel.Claims.Claim>();
 42                 foreach (System.IdentityModel.Claims.ClaimSet cs in evaluationContext.ClaimSets)
 43                 {
 44                     foreach (System.IdentityModel.Claims.Claim claim in cs.FindClaims
 45                         (System.IdentityModel.Claims.ClaimTypes.Name, System.IdentityModel.Claims.Rights.PossessProperty))
 46                     {
 47                         foreach (string str in HelpGetServiceResourceByUserName(claim.Resource.ToString()))
 48                         {
 49                             //授权的资源
 50                             claims.Add(new System.IdentityModel.Claims.Claim("http://tempuri.org/", str, System.IdentityModel.Claims.Rights.PossessProperty));
 51                         }
 52                     }
 53                 }
 54                 evaluationContext.AddClaimSet(this, new System.IdentityModel.Claims.DefaultClaimSet(Issuer, claims)); r_state = true; flag = true;
 55             }
 56             else { flag = true; }
 57             return flag;
 58         }
 59 
 60         #region 私有方法
 61         /// <summary>
 62         /// 通过用户名密码获取资源列表
 63         /// </summary>
 64         /// <param name="userName">用户名</param>
 65         /// <returns></returns>
 66         private List<string> HelpGetRoleListBy(string userName)
 67         {
 68             List<string> list = new List<string>();
 69             XmlDocument doc = new XmlDocument();
 70             doc.Load(AppDomain.CurrentDomain.BaseDirectory + "SafetyVerification\\UserRoleConfig.xml");
 71             XmlNodeList nodes = doc.SelectNodes("UserRoleConfig/User");
 72             foreach (XmlNode node in nodes)
 73             {
 74                 string name = String.Empty;//用户名
 75                 foreach (XmlAttribute xa in node.Attributes)//校验用户名密码
 76                 {
 77                     if (xa.Name == "Name" && xa.Value == userName)
 78                     {
 79                         foreach (XmlNode xn in node.ChildNodes)//查询该用户拥有的角色
 80                         {
 81                             if (xn.Name != "Role")
 82                                 continue;
 83                             list.Add(xn.InnerXml);
 84                         }
 85                         break;
 86                     }
 87                 }
 88             }
 89             return list;
 90         }
 91         /// <summary>
 92         /// 通过用户名获取资源
 93         /// </summary>
 94         /// <param name="userName">用户名</param>
 95         /// <returns></returns>
 96         private IEnumerable<string> HelpGetServiceResourceByUserName(string userName)
 97         {
 98             List<string> lists = new List<string>();
 99             List<string> rlist = HelpGetRoleListBy(userName);
100             XmlDocument doc = new XmlDocument();
101             doc.Load(AppDomain.CurrentDomain.BaseDirectory + "SafetyVerification\\RoleResourceConfig.xml");
102             XmlNodeList nodes = doc.SelectNodes("ResourceConfig/Role");
103             foreach (XmlNode node in nodes)
104             {
105                 foreach (XmlAttribute xa in node.Attributes)
106                 {
107                     if (xa.Name == "Name" && rlist.Contains(xa.Value)) //查询角色下的所有资源
108                     {
109                         foreach (XmlNode xn in node.ChildNodes)
110                         {
111                             if (xn.Name == "Resource")
112                                 lists.Add(xn.InnerXml);
113                         }
114                         break;
115                     }
116                 }
117             }
118             return lists;
119         }
120         #endregion
121         
122     }
123 
124 }
定义一组用于对用户进行授权的规则

 

Xml配置文件

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <UserRoleConfig>
 3   <User Name="ptadmin" PassWord="pt8008" >
 4     <Role>Dictionary</Role>
 5     <Role>PlatForm</Role>
 6   </User>
 7   <User Name="webadmin" PassWord="web8010" >
 8     <Role>Dictionary</Role>
 9     <Role>WebSite</Role>
10   </User>
11   <User Name="eadmin" PassWord="e8011" >
12     <Role>EnterpriseLibrary</Role>
13   </User>
14 </UserRoleConfig>
配置用户和角色

 

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <ResourceConfig>
 3 
 4   <Role Name="Dictionary">
 5     <!--格式:地址+方法名;all表示有权限访问该地址下所有的服务方法-->
 6     <Resource>http://tempuri.org/IService1/all</Resource>
 7   </Role>
 8  
 9   <Role Name="PlatForm">
10     <Resource>http://tempuri.org/IService1/all</Resource>
11     <Resource>http://tempuri.org/IService1/all2</Resource>
12     <Resource>http://tempuri.org/IService1/all3</Resource>
13   </Role>
14 
15   <Role Name="WebSite">
16     <Resource>http://tempuri.org/IService1/all</Resource>
17   </Role>
18   
19   <Role Name="EnterpriseLibrary">
20     <Resource>http://tempuri.org/IService1/all</Resource>
21   </Role>
22 </ResourceConfig>
配置角色和资源

 

web.Config配置文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <system.web>
 4     <compilation debug="true" targetFramework="4.0" />
 5   </system.web>
 6   <system.serviceModel>
 7     <services>
 8       <service name="WcfService自定义授权.Service1" behaviorConfiguration="httpBehavior">
 9         <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsBinding" 
10                   contract="WcfService自定义授权.IService1">
11           <identity>
12             <dns value="JRNet01-PC" />
13           </identity>
14         </endpoint>
15         <host>
16           <baseAddresses>
17             <add baseAddress="http://JRNet01-PC:7794"/>
18           </baseAddresses>
19         </host>
20       </service>
21     </services>
22     <bindings>
23       <wsHttpBinding>
24         <binding name="wsBinding">
25           <security mode="Message">
26             <message clientCredentialType="UserName"/>
27           </security>
28         </binding>
29       </wsHttpBinding>
30     </bindings>
31     <behaviors>
32       <serviceBehaviors>
33         <behavior name="httpBehavior">
34           <serviceMetadata httpGetEnabled="true"/>
35           <serviceCredentials>
36             <serviceCertificate findValue="JRNet01-PC" x509FindType="FindBySubjectName" storeLocation="LocalMachine" 
37                                 storeName="My" />
38             <userNameAuthentication userNamePasswordValidationMode="Custom" 
39                                     customUserNamePasswordValidatorType="WcfService自定义授权.MyCustomUserNameValidator,WcfService自定义授权"/>
40             <clientCertificate>
41               <!--自定义对客户端进行证书认证方式 这里为 None-->
42               <authentication certificateValidationMode="Custom"/>
43             </clientCertificate>
44           </serviceCredentials>
45           <serviceAuthorization serviceAuthorizationManagerType="WcfService自定义授权.CustomServiceAuthorizationManager,WcfService自定义授权">
46             <authorizationPolicies>
47               <add policyType="WcfService自定义授权.CustomAuthorizationPolicy,WcfService自定义授权"/>
48             </authorizationPolicies>
49           </serviceAuthorization>
50         </behavior>
51       </serviceBehaviors>
52     </behaviors>
53   </system.serviceModel>
54   <system.webServer>
55     <modules runAllManagedModulesForAllRequests="true"/>
56   </system.webServer>
57 </configuration>
Web.Config

 

----------------------------------------------------------------------客户端-------------------------------------------------------------------------------------------

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace WCF自定义授权TestClient
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             try
13             {
14                 ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client();
15                 sc.ClientCredentials.UserName.UserName = "admin";
16                 sc.ClientCredentials.UserName.Password = "123456789";
17                 string result = sc.GetStr("asdfg");
18                 Console.WriteLine(result);
19             }
20             catch (Exception ex)
21             {
22                 Console.WriteLine(ex.Message);
23             }
24             Console.ReadLine();
25         }
26     }
27 }
Program-Main
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <system.serviceModel>
 4     <bindings>
 5       <wsHttpBinding>
 6         <binding name="WSHttpBinding_IService1">
 7           <security>
 8             <message clientCredentialType="UserName" />
 9           </security>
10         </binding>
11       </wsHttpBinding>
12     </bindings>
13     <behaviors>
14       <endpointBehaviors>
15         <behavior name="myClientBehavior">
16           <clientCredentials>
17             <!--客户端证书-->
18             <clientCertificate findValue="JRNet01-PC" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/>
19             <serviceCertificate>
20               <authentication certificateValidationMode="None"/>
21             </serviceCertificate>
22           </clientCredentials>
23         </behavior>
24       </endpointBehaviors>
25     </behaviors>
26     <client>
27       <endpoint address="http://netnetnet-pc:5003/Service1.svc" binding="wsHttpBinding"
28           bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
29           name="WSHttpBinding_IService1"  behaviorConfiguration="myClientBehavior">
30         <identity>
31           <dns value="JRNet01-PC" />
32         </identity>
33       </endpoint>
34     </client>
35   </system.serviceModel>
36 </configuration>
配置文件

 

源码下载:WcfService自定义授权.rar

转载于:https://www.cnblogs.com/yf2011/p/4167081.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Web API 数据提供系统相关类型及其关系

转载于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定义数据出错

使用自己拍摄的图片跑 openMVG 的 turtor_demo.py 时&#xff0c;出现错误&#xff0c;没有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因时数…

windows server 2003下安装iis6+php

参照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 这篇文章&#xff0c;即可&#xff01; 前 面我写了《windows安装PHP5.4Apache2.4Mysql5.5》的安装教程&#xff0c;本地实现是很简单的&#xff0c;但是有人还是喜欢用IIS来配置 PHP环境&#xff0c;部分…

winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)

常见问题1&#xff1a; 不允许所请求的注册表访问权 win7、win8 双击程序文件ZSSQL时候会出现 不允许所请求的注册表访问权 的弹窗异常 解决方法&#xff1a;ZSSQL.exe 右键 属性--兼容性--以管理员身份运行此程序 转载于:https://www.cnblogs.com/DemoLee/p/4173324.html

UITabBarController使用总结

刚看了几天教程就开始跟着开发了&#xff0c;以前也没学过C&#xff0c;太痛苦了~只能看看大神的博客&#xff0c;自己再总结学习一下了。 1.首先新建一个TabBarViewController继承于UITabBarController。然后什么都不用写&#xff0c;相当于装各个tab页的容器。 2.给每个视图都…

第一个 mac 程序 Create-JSON-Model

第一个 mac 程序 Create-JSON-Model 效果图 数据 {"ID":null,"name":"Doe","first-name":"John","age":25,"hobbies":["reading","cinema",{"sports":["volley-bal…

Android--简单开发和使用ContentProvider数据共享

今天学习的时候学到了ContentProvider数据共享这个东东&#xff0c;所以自己写了个小例子: 我们要开发ContentProvider的话&#xff0c;需要创建一个类去继承ContentProvider,里面会让你重写四个方法&#xff0c;这四个方法就是数据共享用到的方法 包括SQLite的插入、查询、删除…

ECharts数据图表系统? 5分钟上手!

目录&#xff1a; 前言简介方法一&#xff1a;模块化单文件引入(推荐)方法二&#xff1a;标签式单文件引入【前言】 最近在捣鼓各种插件各种框架&#xff0c;发现这个ECharts还是比较不错的&#xff0c;文档也挺全的&#xff0c;还是中文的&#xff0c;给大家推荐一下。 这篇文…

Solr-5.3.1安装配置

Solr-5.3.1安装配置官方网站:http://lucene.apache.org/solr/http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://lucene.apache.org/solr/quickstart.html环境:CentOS6 x64Solr-5.3.1从Solr5.0开始&#xff0c;Solr不再发布为在任何…

EF for Firebird

今天用了Firebird&#xff0c;记录下怎么用&#xff0c;不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4.6.2.0.msi 备注&#xff1a; 1.发现DDEXProvider 与 FirebirdSql.Data.FirebirdClient安装有先后顺序 1.如果中间出现了…

(接口)银联证书上传被修改的问题和读取证书的绝对路径问题

最近在做对接银联的支付接口。相对于支付宝、微信支付&#xff0c;银联支付接口应该是做的最完美的了。银联支付平台提供了足够详细的接口文档&#xff0c;接口demo&#xff0c;常见问题解决方案。 更人性化的是&#xff0c;个人可以免费注册一个商家账号&#xff0c;提供给你免…

MST:Bad Cowtractors(POJ 2377)

坏的牛圈建筑 题目大意&#xff1a;就是现在农夫又要牛修建牛栏了&#xff0c;但是农夫想不给钱&#xff0c;于是牛就想设计一个最大的花费的牛圈给他&#xff0c;牛圈的修理费用主要是用在连接牛圈上 这一题很简单了&#xff0c;就是找最大生成树&#xff0c;把Kruskal算法改一…

第4章 maven依赖特性

第4章 maven依赖特性 本章详细介绍maven的依赖特性和依赖范围&#xff0c;如何排除依赖。 4.1 什么是依赖传递 举个例子 在非maven项目中&#xff0c;你需要使用spring功能&#xff0c;你会想到导入spring的jar包&#xff0c;那么&#xff0c;srping又需要其他依赖jar包支持&a…

lintcode :Integer to Roman 整数转罗马数字

题目 整数转罗马数字 给定一个整数&#xff0c;将其转换成罗马数字。 返回的结果要求在1-3999的范围内。 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XCIX 更多案例&#xff0c;请戳 http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm 说明 什么是 罗马数字…

VRRP协议具体解释

转帖&#xff1a;http://blog.chinaunix.net/space.php?uid11654074&doblog&id2857384 Contents Page 文件夹 入木三分学网络…

WPF笔记(1.1 WPF基础)——Hello,WPF!

WPF笔记(1.1 WPF基础)——Hello&#xff0c;WPF&#xff01; 原文:WPF笔记(1.1 WPF基础)——Hello&#xff0c;WPF&#xff01;Example 1-1. Minimal C# WPF application//MyApp.csusingSystem;usingSystem.Windows; //the root WPF namespacenamespaceMyFirstAvalonApp { cla…

c#入门系列——类和对象的代码实现

面向对象 说起面向对象&#xff0c;大家因该都听说过&#xff0c;也知道是一个编程的方法&#xff0c;简称oop技术。它将对象的算法和数据结构看作一个整体&#xff0c;而一个程序就是由多个对象结合的整体。这样做可以提高代码的复用率&#xff0c;提高了软件的可维护性。 属性…

安卓TCP通信版本2

PC做服务器&#xff0c;安卓做客户端。 安卓获取输入框的内容并发送&#xff0c;然后等待接收服务器的消息 服务器先行开启&#xff0c;接收到客户端的数据&#xff0c;然后回复消息。 实现了对线程类的封装&#xff0c;通过按钮启动线程发送并接收 服务器代码&#xff08;java…

简述WebService的使用(一)

环境&#xff1a; vs版本&#xff1a;vs2013 windows版本&#xff1a;win7 IIS版本&#xff1a;IIS7.0 &#xff08;如果觉得对您有用&#xff0c;请点击右下角【推荐】一下&#xff0c;让更多人看到&#xff0c;谢谢&#xff09; 配置环境&#xff1a; 主要针对于IIS 首先&…