WCF身份验证问题

LIZHIztt 2017-02-06 09:36:08
WCF需要身份验证(非证书),调用服务的时候需要传入用户名和密码,这样在每一个服务中都必须写验证代码,感觉很繁琐,好像消息拦截可以实现,求指教
...全文
177 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
现成的框架的作者会有很多想法,都跟实践应用有关。有些应用适合特定的爱好,并不是选择最简单最直接的方式。比如说令牌编号写到消息头中,那么看起来每一个服务(除了登录以外)似乎不用增加一个参数,而实际上你肯定还是增加了这个参数的,只不过它在 http 消息头中而不在消息体中,你的客户端和服务器端都需要做更大的技术改动。 假设我如果为了“显得跟别人公司的技术不一样”而采用不同的、繁琐一点的框架,那么肯定发布这个框架的作者就会想办法给封装一些抽象的东西,来减轻实现难度。这就是抽象复抽象的结果。 实际上我们先讨论基本原理,实现的时候可以根据自己的爱好进行各种花样儿选择。
LIZHIztt 2017-02-06
  • 打赏
  • 举报
回复
目前是使用restful风格的URL, 提交 http://127.0.0.1/Add/{json数据} 删除 http://127.0.0.1/Del/{json数据} 如果增加TOKEN,URL该如何设计?路由怎么解决? 如何从 AfterReceiveRequest 内读取TOKEN,如果验证失败,AfterReceiveRequest 返回值如何设置,直接throw?
  • 打赏
  • 举报
回复
其实就是通过各种环境参数自定义访问令牌AccessToken,windows中到处是这种东西
  • 打赏
  • 举报
回复
你可以简单得写在System.ServiceModel.Channels.Message.Headers中 在调用方利用IClientMessageInspector,统一添加验证头,不用每个方法中去写 P哥的思路也很简便 另外,WCF是可以基于Session的,可以结合使用 http://blog.csdn.net/tcjiaan/article/details/8281782
  • 打赏
  • 举报
回复
引用 3 楼 41756620 的回复:
BehaviorExtensionElement 有什么作用?
顾名思义 所谓的拦截,其实也只是提供一个容器,开发者只需要向其中注册自己的处理器就行。 .Net中几乎所有的子平台都有类似的机制
  • 打赏
  • 举报
回复
Id 是参数的参数 --> Id 是提交的普通参数
  • 打赏
  • 举报
回复
引用 5 楼 41756620 的回复:
如何在验证逻辑中获取POST提交的用户名或密码(或令牌)信息?
Id 是参数的参数啊。比如说某个服务是“将用户UserId从部门 DeptId1 中移到 另一个部门 DeptId2去”,那么这个服务有几个参数?4个啊!多一个 PassportId 参数就行了。 让调用者很简单地在(除了登录注册服务以外)每一个服务上都传一个 PassportId 授权编号参数,就行了。这纯粹是设计理解问题,不需要什么技术。
LIZHIztt 2017-02-06
  • 打赏
  • 举报
回复
如何在验证逻辑中获取POST提交的用户名或密码(或令牌)信息?
  • 打赏
  • 举报
回复
引用 楼主 41756620 的回复:
这样在每一个服务中都必须写验证代码,感觉很繁琐,好像消息拦截可以实现
消息拦截不拦截地,都是技术问题。在业务面前,单纯纠结技术无用。消息如果是服务的明确参数,也就用不着什么拦截,用不着纠结技术。 对外发布的服务可能收到各种各样的请求(包括攻击),所以任何请求到来的时候你都需要“验证”,不可能不需要验证。当你收到 PassportId 的时候,你用这个 key 访问到之前授权给客户端的会话信息集合,取到了就是验证过了(可以进一步验证,例如判断此通行证是否过期了),没取到就是非法授权号。
LIZHIztt 2017-02-06
  • 打赏
  • 举报
回复
BehaviorExtensionElement 有什么作用?
  • 打赏
  • 举报
回复
引用 楼主 41756620 的回复:
WCF需要身份验证(非证书),调用服务的时候需要传入用户名和密码,
只有登录服务的第一个功能需要传入用户名和密码!一旦验证密码通过,返回一个 passportId 授权编号(例如 8239askdfaf923942ksdfa),以后客户再调用服务的时候只要提供这个 passportId 就行了,不用再传用户名、密码。 实际上网页的 SessionID 也是如此。只不过你不用网页,那么你就需要自己实现一个服务的会话编号机制。
  • 打赏
  • 举报
回复
public class MyBehavior : BehaviorExtensionElement, IEndpointBehavior
{
      public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            //clientRuntime.MessageInspectors.Add(new MyInterceptor());
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInterceptor());
        }

        public void Validate(ServiceEndpoint endpoint) { }

        public override Type BehaviorType
        {
            get { return typeof(MyBehavior); }
        }

        protected override object CreateBehavior()
        {
            return new MyBehavior();
        }
}

public class MyInterceptor : IDispatchMessageInspector//, IClientMessageInspector
{
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
        {
                //验证逻辑
        }
}
最后记得配置 <system.serviceModel> <extensions> <behaviorExtensions> <add name="messageInterceptor" type="命名空间.MyBehavior, 程序集名称"/> </behaviorExtensions> </extensions> </system.serviceModel>

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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