WCF 自定义授权

本文详细介绍了如何使用WCF实现基于角色的权限验证与授权,包括自定义用户名验证器、自定义授权策略及服务端配置,确保了系统的安全性与灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IdentityModel.Claims;
using System.IdentityModel.Policy;
using System.IdentityModel.Selectors;

namespace Services
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string Select();
        [OperationContract]
        string Add();
        [OperationContract]
        string Delete();
    }

    class Service:IService
    {

        public string Select()
        {
            return "Select 被调用";
        }

        public string Add()
        {
            return "Add 被调用";
        }

        public string Delete()
        {
            return "Delete 被调用";
        }
    }

    public class CustomServiceAuthorizationManager : ServiceAuthorizationManager
    {
        protected override bool CheckAccessCore(OperationContext operationContext)
        {
            string action = operationContext.RequestContext.RequestMessage.Headers.Action;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("----------------------------");
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("请求的资源,URI:{0}", action);
            //ClaimSet 表示与某个实体关联的声明的集合。
            //获取与授权策略关联的声明集
            foreach (ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
            {
                if (cs.Issuer == ClaimSet.System)
                {
                    foreach (Claim claim in cs.FindClaims("http://tempuri.org/", Rights.PossessProperty))
                    {
                        Console.WriteLine("服务器声明检查,URI:{0}",action);
                        if (claim.Resource.ToString() == action)
                        {
                            Console.WriteLine("通过,URI:{0}",action);
                            return true;
                        }
                    }
                }
            }
            Console.WriteLine("不通过,URI:{0}",action);
            return false;
        }
    }

    public class MyCustomUserNameValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName == null || password == null)
            {
                throw new ArgumentNullException("用户名或密码不能为空");
            }
            if (userName != "admin" && userName != "admin2")
            {
                throw new Exception("该用户不存在");
            }
        }
    }

    //定义一组用于对用户进行授权的规则。
    public class CustomAuthorizationPolicy : IAuthorizationPolicy
    {
        string id = string.Empty;
        public CustomAuthorizationPolicy()
        {
            id = new Guid().ToString();
        }

        public bool Evaluate(EvaluationContext evaluationContext, ref object state)
        {
            bool flag = false;
            bool r_state = false;
            if (state == null) { state = r_state; } else { r_state = Convert.ToBoolean(state); }

            if (!r_state)
            {
                List<Claim> claims = new List<Claim>();
                foreach (ClaimSet cs in evaluationContext.ClaimSets)
                {
                    foreach (Claim claim in cs.FindClaims(ClaimTypes.Name, Rights.PossessProperty))
                    {
                        Console.WriteLine("用户 : {0}", claim.Resource);
                        foreach (string str in GetOperationList(claim.Resource.ToString()))
                        {
                            claims.Add(new Claim("http://tempuri.org/", str, Rights.PossessProperty));
                            Console.WriteLine("授权的资源:{0}", str);
                        }
                    }
                }
                evaluationContext.AddClaimSet(this, new DefaultClaimSet(Issuer, claims)); r_state = true; flag = true;
            }
            else { flag = true; }
            return flag;
        }

        private static IEnumerable<string> GetOperationList(string username)
        {
            List<string> lists = new List<string>();
            if (username == "admin")
            {
                lists.Add("http://tempuri.org/IService/Select");
                lists.Add("http://tempuri.org/IService/Add");
                lists.Add("http://tempuri.org/IService/Delete");
            }

            else if (username == "admin2")
            {
                lists.Add("http://tempuri.org/IService/Select");
            }
            return lists;
        }

        public ClaimSet Issuer
        {
            get { return ClaimSet.System; }
        }

        public string Id
        {
            get { return id; }
        }
    }
}

 

服务端配置代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Services.Service" behaviorConfiguration="httpBehavior">
        <endpoint address="" binding="wsHttpBinding" contract="Services.IService" bindingConfiguration="wsBinding"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9001/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="wsBinding">
          <security mode ="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="httpBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="WCFServerPK" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
            <userNameAuthentication customUserNamePasswordValidatorType="Services.MyCustomUserNameValidator,Services" userNamePasswordValidationMode="Custom"/>
          </serviceCredentials>

          <serviceAuthorization serviceAuthorizationManagerType="Services.CustomServiceAuthorizationManager,Services">
            <authorizationPolicies>
              <add policyType="Services.CustomAuthorizationPolicy,Services"/>
            </authorizationPolicies>
          </serviceAuthorization>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

--------------------------------------------------------------------------------------------------------------------------------------------------------

客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Clients
{
    class Program
    {
        static void Main(string[] args)
        {
            localhost.ServiceClient proxy = new Clients.localhost.ServiceClient();
            proxy.ClientCredentials.UserName.UserName = "admin";
            proxy.ClientCredentials.UserName.Password = "123456789";
            string result = proxy.Add();
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}

转载于:https://www.cnblogs.com/wangshuai/archive/2010/06/17/1759520.html

基于C#开发的一个稳定可靠的上位机系统,旨在满足工业控制的需求。该系统集成了多个功能界面,如操作界面、监控界面、工艺流显示界面、工艺表界面、工艺编辑界面、曲线界面和异常报警界面。每个界面都经过精心设计,以提高用户体验和工作效率。例如,操作界面和监控界面对触摸屏友好,支持常规点击和数字输入框;工艺流显示界面能够实时展示工艺步骤并变换颜色;工艺表界面支持Excel和加密文件的导入导出;工艺编辑界面采用树形编辑方式;曲线界面可展示八组曲线并自定义纵坐标数值;异常报警界面能够在工艺流程出现问题时及时报警。此外,该系统还支持与倍福TC2、TC3和西门子PLC1200/300等下位机设备的通信,确保生产线的顺畅运行。系统参考欧洲工艺软件开发,已稳定运行多年,证明了其可靠性和稳定性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对C#编程有一定基础的人群。 使用场景及目标:适用于需要构建高效、稳定的工业控制系统的企业和个人开发者。主要目标是提升生产效率、确保生产安全、优化工艺流程管理和实现数据的有效管理与传输。 其他说明:文中提供了部分示例代码片段,帮助读者更好地理解具体实现方法。系统的复杂度较高,但凭借C#的强大功能和开发团队的经验,确保了系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值