zoukankan      html  css  js  c++  java
  • 【蛙蛙推荐】基于令牌的分布式身份验证

    思路:
    web服务使用虽然方便,但安全是个问题,在企业开发中,经常面临多界面的客户端,使用你的服务的可能是个桌面程序也可能是个移动应用,这就要求集中的身份验证,而web服务来做这个事情是最合适不过的。我们先来用一个UserLoginInfo来保存登陆用户的令牌(token),主机地址(host)和安全上下文(IPrincipal),当然了真实环境中这些东西肯定应该是保存在数据库中的,然后写个sql job来定时清理过时的令牌。我们首先要写个身份验证的web服务(AuthenticateService.asmx),此服务用来进行身份验证,令牌检测,用户注销,获取安全上下文等功能。然后我们要开发一个业务服务的基类(ServiceBase.cs),因为调用每个业务服务的时候要保证这个调用是授权的,所以有好多共性的东西,所以我们提取一个基类出来,它主要有验证令牌,角色检验,注销等方法。因为web服务是无状态的,所以我们要用SOAP头来传递令牌,这样我们要定义一个tokenHeader的SOAP头,并把它声明在每个需要身份验证的web方法前。这样你就可以开发你的安全的业务服务了。
    流程是这样的,你要使用一个业务服务,首先从身份验证服务那里进行身份验证,这时候会身份验证服务返回一个令牌,并把这个令牌和你的主机IP保存在UserLoginInfo的字典类里,你获取到这个这个令牌后把它缓存起来,然后在调用业务服务的时候把令牌赋值给SOAP头,它会自动传递。业务服务收到你的调用后,首先会调用基类的身份验证方法看看这个令牌是否合法(UserLoginInfo类里是否保存有这个令牌),然后检查你的IP是否和此令牌匹配,如果完全检查通过再让你使用实际的业务服务,否则会抛出Web异常,然后包装成SOAP异常,你客户端获取SOAP异常后再进行解析成友好的错误提示。
    下载地址:https://files.cnblogs.com/onlytiancai/EnterpriseDev.rar

    简介:
    思路介绍完了,简单介绍一下如何实现的,下面是一个业务服务方法
        EntitySerializer es = new EntitySerializer(EntitySerializeType.Xml);
        [WebMethod]
        [SoapHeaderAttribute("Token",
             Direction = SoapHeaderDirection.In)]
        public string GetAllOrders()
        {
            Authenticate();

            return es.SerializeArray(service.GetAllOrders());
        }
    可以看到调用它需要传送一个SOAP头,这个SOAP头会填充私有变量Token(简单起见,令牌用GUID格式),然后调用基类的Authenticate()方法进行身份检查,检查通过后调用实际的业务逻辑。
    注意:
    1、NBear的持久层返回的实体都是接口,接口是不可以直接序列化的,所以不能通过WEB服务传递,这样就需要使用NBear的使用函数来把返回接口序列化成字符串再传递,然后客户端也用此类来解序列化。
    2、web服务的令牌用SOAP可以简单的传递,如果是Remoting的话用System.Runtime.Remoting.Messaging.CallContext.SetData()和GetData()让令牌自动在上下文中传递。

    再看看客户端如何调用,我们用一个winform窗体TestWebService.cs(TestApp项目)来演示。

        //调用身份验证服务进行身份验证并缓存令牌
        loginToken = service.Authenticate(txtName.Text, txtPassword.Text);

        //实例化业务服务,创建SOAP头,并给SOAP头用缓存的令牌赋值
        usefulService = new TestApp.OrderOperator.OrderService();
        usefulService.TokenHeaderValue = new TestApp.OrderOperator.TokenHeader();
        usefulService.TokenHeaderValue.InnerToken = loginToken;
       
        //使用业务服务获取数据并解序列化成接口实体数组,最后绑定到控件上
        orders = es.DeserializeArray<Orders>(usefulService.GetAllOrders());
        listOrders.DisplayMember = "OrderID";
        listOrders.DataSource = orders;

    注释写的很清楚了,不多说了,更详细的演示看下载的代码。

    这次更新的代码又添加了以下几项技术。
    1、winform2.0的TableLayoutPanel控件的使用
    2、SOAP头的使用
    3、SOAP异常的包装
    4、NBear的序列化和解序列化

    声明:演示代码中的Soap异常的包装和反包装是用的zongsoft的

    下一步演示是Wap站点和Web门户,然后再演示remoting的性能计数、跟踪、授权等技术。

  • 相关阅读:
    Encrypted Handshake Message
    RSAParameters Struct
    What if JWT is stolen?
    What's the difference between JWTs and Bearer Token?
    RSA Algorithm Example
    第18届Jolt大奖结果公布
    Ruby on rails开发从头来(windows)(三十六) 调试技巧
    Ruby on rails开发从头来(四十二) ActiveRecord基础(主键和ID)
    YouTube开放基础技术架构 让用户建自家YouTube
    Ruby on rails开发从头来(四十) ActiveRecord基础(Boolean属性)
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/478095.html
Copyright © 2011-2022 走看看