关于wcf调用权限有关问题

关于wcf调用权限问题
我在wcf建了两个方法A和B,现在有IP验证了,不过未来方法如果多了,还想继续添加多一个验证.
就是A用户只能调用A方法,B用户只能调用B方法.有什么好的解决方案?
------解决思路----------------------
引用:
Quote: 引用:

现在不知道你的IP验证是怎么实现的……
但你后面的要求是希望进行资源验证,那就是RBAC的概念
http://www.cyqdata.com/cnblogs/article-detail-38124


后台接口,我本以为建两个属性出来,前台直接复制的,不过公测模式点不出来。导致不知道怎么传参数进来

private string _appkey;
        public string Appkey { get { return _appkey; } set { _appkey = value; } }

        private string _appsecret;
        public string Appsecret { get { return _appsecret; } set { _appsecret = value; } }

        public VMService() { }

        public VMService(string appkey, string appsecret)
        {
            using (KS.Data.MicrosoftSQL db = new KS.Data.MicrosoftSQL())
            {
                Dictionary<string, object> dy = new Dictionary<string, object>();
                dy.Add("appkey", appkey); dy.Add("appsecret", appsecret);
                if (db.Procedure2Result("sp_tbl_WebAPI_AppKey_Check", dy) <= 0)//执行过程返回是否符合
                {
                    throw new Exception("appKey与secret不符或appKey已经停用。");
                }
            }

            //OperationContext context = OperationContext.Current;
            //MessageProperties mp = context.IncomingMessageProperties;
            //RemoteEndpointMessageProperty remp = mp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            //string adds = System.Configuration.ConfigurationManager.AppSettings["ClientIP"];

            //if (remp.Address != "::1" && !remp.Address.Contains(adds))
            //{
            //    throw new Exception("IP限制" + remp.Address);
            //}
        }

前台调用

using (ChannelFactory<VMService.IVMService> cf = new ChannelFactory<VMService.IVMService>("IVMService"))
            {   
                VMService.IVMService vm = cf.CreateChannel();

                VMService.Appkey  //这样点不到这个属性的,所有我不知道怎么传进去,而且我不想每个方法都传一次,这样太不好了.

                string public_key = "BgIAAACkAABSU0ExAAQAAA";
                
                Response.Write("获取LRC01002积分: " + vm.GetVMPoint(RSALibrary.RSA.Encrypt(public_key, "LRC01002")));
                Response.Write("<br>");
                Response.Write("获取LRC01002积分明细: " + vm.GetVMPointDetail(RSALibrary.RSA.Encrypt(public_key, "LRC01002")));
            }

看看各位大神有什么好的方法可以做验证的.
谢谢!


如果你修改wcf服务定义,例如增加了属性定义,你的客户端应该重新获取wcf的客户端代理。如果不重建,自然”点不出“新的属性。

验证权限是服务器端在提供数据服务之前”一瞬间“需要做的事情,客户端永远不用管它(也不调用它)。客户端只提供 appkey这类参数。

那么服务器端在判断 appkey 跟 appsecret 是否匹配之前,应该先从 Cache 集合中读取一下“是否有过检查”,而不是额外多查询几万次数据库。

随便写了例子,应该这样写
    public CheckRole(string appkey, string appsecret)
    {
        var cache = HttpRuntime.Cache;
        var key = string.Format("{0}访问{1}功能的权限", appkey, appsecret);
        var res = cache[key];
        if(res == null)
        {
            using (KS.Data.MicrosoftSQL db = new KS.Data.MicrosoftSQL())
            {
                Dictionary<string, object> dy = new Dictionary<string, object>();
                dy.Add("appkey", appkey); dy.Add("appsecret", appsecret);
                res = db.Procedure2Result("sp_tbl_WebAPI_AppKey_Check", dy) <= 0)
                cache.Insert( key, res);   //实际上,将来你可以在第三个个参数中增加SqlDependency等缓存依赖控制机制
            }
        }
        return res;
    }


这里,你只需要查询一次。在cache.Insert的第三个参数(甚至可以使用第4、5个参数)中,你可以控制让程序仅在权限表被修改、或者某个Cache单元被修改、或者某个文件被修改、或者1分钟之后,才去读取数据库。

而不会傻傻地去查询数据库。