请教,wcf消息拦截中如果得到request的方法名称?

一本正经道 2017-05-11 04:24:17
如题,在做wcf消息拦截时(用于身份认证),如何将登陆这样的特定方法过滤不拦截呢?

我是在接收request时进行拦截,方法内容如下:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
string Token = request.Headers.GetHeader<string>("Token", "www.test.com");
if (Token != "ABC")
{
throw new Exception("未经授权的访问!");
}
return null;
}

...全文
1242 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
超黑胖子 2017-12-08
  • 打赏
  • 举报
回复
专业接分的来了,
一本正经道 2017-12-07
  • 打赏
  • 举报
回复
没人来拿分么
一本正经道 2017-09-06
  • 打赏
  • 举报
回复
没人回答吗……把我的解决方法贴一下吧。包含wcf接收数据后的整个类:

    /// <summary>
    /// 服务端检查器
    /// </summary>
    public class AuthenticationInspector : IDispatchMessageInspector  
    {
        /// <summary>
        /// 接收请求后执行
        /// </summary>
        /// <param name="request"></param>
        /// <param name="channel"></param>
        /// <param name="instanceContext"></param>
        /// <returns></returns>
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            // 取得客户端ip和端口
            RemoteEndpointMessageProperty endpoint = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            string ss = endpoint.Address;
            if (ss=="127.0.0.1" || ss=="localhost" || ss=="::1" || ss.Contains("192.168.1."))// 过滤本地来源的连接,测试环境的初始化连接也会包含进来。
            {
                return null;
            }

            // 从header中取得action名称
            string action = request.Headers.Action;// 这里是关键
            if (!string.IsNullOrEmpty(action)) {// 如果包含头,那么仅过滤login方法
                string methodName = action.Substring(action.LastIndexOf("/")+1);
                if(!String.IsNullOrEmpty(methodName) && ("UserLogin".Equals(methodName, StringComparison.InvariantCultureIgnoreCase) || "UserAuthLogin".Equals(methodName, StringComparison.InvariantCultureIgnoreCase) || "GetRegMachine".Equals(methodName, StringComparison.InvariantCultureIgnoreCase))) {// 这里过滤了三个调用名称
                    return null;
                }
            } else {
                throw new Exception("未经授权的访问!");
            }

            // 最后验证令牌,header传递令牌安全性并不高,所以慎用。
            try {
                var name = request.Headers.GetHeader<String>("UserName", "123231");
                var random = request.Headers.GetHeader<String>("Token", "123231");
                string key = $"SERVICE_AUTH_USER_CACHE_{name}";
                var user = Common.CacheHelper.GetInstance().GetCache<Models.UserModel>(key);
                if(user == null) {
                    user = DataProvider.User.GetUserByName(name);
                    if(user != null && user.IsEnable == (int)Common.YesOrNo.Yes && user.Random == random) {
                        Common.CacheHelper.GetInstance().AddCache(key,user,30);
                    }
                }                    
                if(user != null && user.IsEnable == (int)Common.YesOrNo.Yes) {
                    return null;
                } else {
                    throw new System.ServiceModel.FaultException("用户名不存在或密码错误!", new System.ServiceModel.FaultCode("404"));
                }
            } catch(Exception ) {
                throw new System.ServiceModel.FaultException("禁止访问!", new System.ServiceModel.FaultCode("404"));
            }            
        }

        /// <summary>
        /// 发送相应前执行, 这里放空,也可以自定义其他动作。
        /// </summary>
        /// <param name="reply"></param>
        /// <param name="correlationState"></param>
        public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
        }
    }

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧