关于wcf调用权限有关问题
关于wcf调用权限问题
我在wcf建了两个方法A和B,现在有IP验证了,不过未来方法如果多了,还想继续添加多一个验证.
就是A用户只能调用A方法,B用户只能调用B方法.有什么好的解决方案?
------解决思路----------------------
如果你修改wcf服务定义,例如增加了属性定义,你的客户端应该重新获取wcf的客户端代理。如果不重建,自然”点不出“新的属性。
验证权限是服务器端在提供数据服务之前”一瞬间“需要做的事情,客户端永远不用管它(也不调用它)。客户端只提供 appkey这类参数。
那么服务器端在判断 appkey 跟 appsecret 是否匹配之前,应该先从 Cache 集合中读取一下“是否有过检查”,而不是额外多查询几万次数据库。
随便写了例子,应该这样写
这里,你只需要查询一次。在cache.Insert的第三个参数(甚至可以使用第4、5个参数)中,你可以控制让程序仅在权限表被修改、或者某个Cache单元被修改、或者某个文件被修改、或者1分钟之后,才去读取数据库。
而不会傻傻地去查询数据库。
我在wcf建了两个方法A和B,现在有IP验证了,不过未来方法如果多了,还想继续添加多一个验证.
就是A用户只能调用A方法,B用户只能调用B方法.有什么好的解决方案?
------解决思路----------------------
如果你修改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分钟之后,才去读取数据库。
而不会傻傻地去查询数据库。