美文网首页
WCF:UserNamePasswordValidator验证器

WCF:UserNamePasswordValidator验证器

作者: 天山的虫 | 来源:发表于2019-09-29 23:04 被阅读0次

Validator获取请求信息

1.能不能在UserNamePasswordValidator获取OperationContext

答案:不直接可能,具体请参照以下回答
WCFValidator中获取上下文Context和问题

It is not possible. Validation runs in different thread and it doesn't have access to WCF contexts.

2.通过消息拦截器缓存OperationContext

WCF使用消息拦截器获取Context

参考:接口实现日志监控和并发限流

消息拦截类

public class DemoMessageInspector:IDispatchMessageInspector{
  public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext       
      instanceContext){
                //ServiceContext为自己实现的缓存类
                ServiceContext.CurrentAction = request.headers.Action.ToString();
   }
   public void BeforeSendReply(ref Message reply, object correlationState){
                //WCF每个Action结束后要置null
                ServiceContext.CurrentAction = null; 
   }
}

Attribute类:

public class ActionServiceBehaviorAttribute:Attriburte,IServiceBehavior{
            //此处参考引用块的代码
}

Service类

[ActionServiceBehaviorAttribute]
public class ActionService:IAction{
  public void Login(){

  } 
}

然后在验证器除调用ServiceContext缓存的信息即可


-------------------------------------------验证器Validator捕获异常相关问题---------------------------------------------------


验证器Validator

public classUserValidator:UserNamePasswordValidator{
public override void Validate(string username,string password){
  bool flag = UserContext.Validate(username,password);
  if(flag == false){
     Log.error("username or password error!");
  }else{
    Log.info("Login success!");
  }
}

问题描述

最开始的时候,想在验证器抛出异常让客户端捕获,然后实际上来说,所有的异常如果直接在验证器抛出,例如:

public classUserValidator:UserNamePasswordValidator{
public override void Validate(string username,string password){
  bool flag = UserContext.Validate(username,password);
  if(flag == false){
     throw new PasswordException();
  }else{
    Log.info("Login success!");
  }
}

在客户端实际捕获的都是MessageSecurityException异常

解决方案:绕过问题

在网上找了一圈解决方案,最后都没有解决问题,很多都说抛出的异常实在MessageSecurityException的innerException中(例如:WCF身份验证),实际上我实测并没有,我的解决如下:

服务端:

public interface IClient{
  void Login(string username,string password);
}
public class ClientImpl:IClient{
  public void Login(){
    thorw new PasswordException();    
  }
}

客户端:

...
catch{
  if(ex.Message.Contains("PasswordException")){
    //to do something
  }
}
...

总结

说白了就是在真正登陆的WCF接口中抛出异常,然后在客户端去捕获,在做相应的处理,并不是什么高明的办法,如果各位道友有能在UserNamePasswordValidator抛出并在客户端获取的Demo请务必告诉我,谢谢!

相关文章

  • WCF:UserNamePasswordValidator验证器

    Validator获取请求信息 1.能不能在UserNamePasswordValidator获取Operatio...

  • 关于vue项目请求WCF服务跨域的问题(后台设置)

    项目中要求使用WCF服务获取手机号验证码和验证验证码两个接口。因为浏览器的同源策略,调试中发现报错跨域,与后台沟通...

  • WCF

    wcf精通系列 无废话WCF系列教程 Windows Communication Foundation(WCF)是...

  • WCF学习目录

    WCF 基本 WCF概念 WCF配置文件详解 多个不同类对象传输思路 WCF 大文件传输配置 Uri ? & = ...

  • WCF简单例子+Asp.Net MVC调用+WinForm调用

    1.创建WCF服务项目: 阐述:WCF服务库与WCF服务应用程序的区别。 WCF服务库,可以认为是一个包含WCF服...

  • 1.WCF 简介

    WCF是什么技术? WCF(Windows Communication Foundation) - Windows...

  • ThinkPHP5.0验证

    一、分类:1、独立验证2、验证器二、代码描述 1.独立验证 2.验证器 三、比较验证器比独立验证封装性更好

  • thinkphp5.1

    一、验证器 官方文档:验证器官方文档:验证场景 验证器定义 数据验证 批量验证 抛出验证异常 自定义验证规则

  • tp框架验证器实现

    验证器 概述 ThinkPHP5.0验证使用独立的\think\Validate类或者验证器进行验证。 独立验证 ...

  • Validators - Django REST framewo

    验证器-Django REST框架 validators.py 验证器 验证器对于在不同类型的字段之间重用验证逻辑...

网友评论

      本文标题:WCF:UserNamePasswordValidator验证器

      本文链接:https://www.haomeiwen.com/subject/vkzpyctx.html