客户端登录验证 -- ESFramework 4.0 快速上手(15)

      在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现。在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了在初始化时验证用户的帐号密码的功能,这使得登录验证变得更加简单。

 

一. ESPlus.Application.Basic 空间的支持

      为了实现验证用户账号密码的功能,ESPlus.Application.Basic 命名空间增加了几个基础设施。

(1)ESPlus.Application.Basic.Passive.IBasicOutter 增加了Logon方法:

        /// <summary>
        /// 客户端登陆验证。
        /// </summary>
        /// <param name="systemToken">系统标志。</param>
        /// <param name="password">登陆密码</param>      
        LogonResult Logon(string systemToken, string password);

      该方法向服务端提交当前登录用户的账号、密码、系统标志等信息,然后返回服务端验证后的登录结果。系统标志systemToken,用于表示当前客户端来自哪个系统,服务端可以验证这个标志是否与服务端匹配,以判断客户端与服务端是否属于同一套系统。在普通的应用中,我们可以忽略它。

      登录结果使用LogonResult 枚举表示:

    public enum LogonResult
    {
        /// <summary>
        /// 登陆成功
        /// </summary>
        Succeed = 0,
        /// <summary>
        /// 账号或密码错误
        /// </summary>
        ErrorUserOrPassword,
        /// <summary>
        /// 已在其它地方登陆
        /// </summary>
        HadLoggedOn
    }

      如果我们的服务端的重登陆模式设置为RelogonMode.IgnoreNew,而本次登录所用的UserID已经在线上了,那么Logon方法将返回LogonResult.HadLoggedOn,以表明该用户已在其它地方登录。

 

(2)ESPlus.Application.Basic.Server空间增加IBasicBusinessHandler接口

      当客户端提交了当前登录用户的账号、密码、系统标志等信息到服务端后,服务端通过调用IBasicBusinessHandler来验证帐户信息。

    public interface IBasicBusinessHandler
    {
        /// <summary>
        /// 客户端登陆验证。
        /// </summary>        
        /// <param name="userID">登陆用户账号</param>
        /// <param name="systemToken">系统标志。用于验证客户端是否与服务端属于同一系统。</param>
        /// <param name="password">登陆密码</param>
        /// <returns>如果密码和系统标志都正确则返回true;否则返回false。</returns>
        bool VerifyUser(string systemToken, string userID, string password);
    }

      注意,我们在实现IBasicBusinessHandler时,并不需要判断重登陆模式和用户是否已经在线了,这些已经由框架帮我们做好了。所以,VerifyUser方法只是返回一个bool值,来表示帐号密码是否正确。在实现该接口,并将其注入到ESPlus,就可以通过调用IBasicOutter的Logon方法来验证用户了。

      框架提供了null object模式的IBasicBusinessHandler实现EmptyBasicBusinessHandler,其在实现VerifyUser方法时,始终返回true。

     

二.Rapid引擎内置登录验证

      本次版本变更中,客户端Rapid引擎和服务端Rapid引擎的Initialize方法都有所变化,以支持用户登录验证的机制。

(1)IRapidPassiveEngine 的Initialize方法: 

   LogonResult Initialize(string userID, string logonPassword, string serverIP, int serverPort, IBasicBusinessHandler basicHandler, ICustomizeInfoBusinessHandler customizeHandler);

      该方法新增加了登录密码logonPassword参数,并返回登录结果。

      在内部实现中,Initialize方法首先与服务器建立TCP连接,然后通过IBasicOutter的Logon方法发送登录验证请求并获取登录结果,如果登录成功,则直接返回;否则,关闭TCP连接,再返回结果。要注意的是,如果与服务器建立TCP连接失败,Initialize会直接抛出对应的异常,而不是通过返回值来表达。

      IBasicOutter的Logon方法所需的systemToken从哪里来了?IRapidPassiveEngine 新增了一个可读写的属性SystemToken,如果我们设定了它,Logon方法将会将其作为参数值传入。 

      在用户登录尝试的过程中,程序可以反复调用Initialize来进行验证,而不需要每次都new一个客户端Rapid引擎实例。只有Initialize方法返回登录成功后,Rapid引擎的相关属性才是可用的。比如,我们可以通过其新增的CurrentUserID属性,来知道当前成功登录的用户的UserID。

     

(2)IRapidServerEngine 的Initialize方法:

    void Initialize(int port, ICustomizeInfoBusinessHandler customizeInfoBusinessHandler, IBasicBusinessHandler basicBusinessHandler, IFileBusinessHandler fileBusinessHandler, IFriendsManager friendsManager, IGroupManager groupManager);        

      服务端Rapid引擎的Initialize方法增加了IBasicBusinessHandler参数,正如前所述,服务端正是通过它来验证客户端提交的帐户信息的。如果我们不关心帐户验证,那么可以传入上面提到的EmptyBasicBusinessHandler实例,或直接传入null -- 此时,引擎内部将默认使用EmptyBasicBusinessHandler来处理用户的登陆验证。

 

(3)对于大多数系统,登录时使用账号密码就已经足够。有些特殊的系统,如果在登录时需要验证更多的信息(比如时间戳等),那么大家可以巧用IRapidPassiveEngine的SystemToken属性来传递这些额外的验证信息,因为SystemToken的值也会被提交给服务端的VerifyUser方法进行验证。 

 

      结合本次版本变更,我们已经发布了最新ESFramework、帮助文档、以及更新了所有Demo源码。大家可以从ESFramework 4.0 概述文末下载。

 

ESFramework 4.0 概述

ESFramework 4.0 有哪些优点?

ESFramework 4.0 版本升级说明(持续更新)

《ESFramework 4.0 快速上手》系列所有文章

《ESFramework 4.0 高级进阶》系列所有文章  

 

 

时间: 2024-09-16 22:34:08

客户端登录验证 -- ESFramework 4.0 快速上手(15)的相关文章

聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

      在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前demo的基础上添加使用ESFramework.SL开发的Silverlight客户端.这样一来,不仅Silverlight客户端之间可以相互通信,Silverlight客户端还可以跟winform客户端进行通信.如果不了解在Silverlight中如何使用ESFramework,可以先看

重登陆模式 --ESFramework 4.0 快速上手(07)

在ESFramework框架中基于TCP的服务端引擎(当然也包括Rapid引擎)都采用了这样一条规则:默认情况下,客户端与服务器成功建立TCP连接以后,服务端会从客户端发过来的第一条消息中取出消息头的UserID属性的值,并将其与对应的TCP连接绑定起来.这样,服务端就知道每一个TCP连接所对应的用户UserID,而当我们要求服务端向某个客户端发送消息时,服务端就知道通过哪个TCP连接进行发送了.TCP连接与UserID是一一对应的,一个TCP连接只能对应一个UserID,同样的,一个UserI

在Silverlight中使用ESFramework-- ESFramework 4.0 快速上手(05)

Silverlight已经到4.0版本了,已经相当成熟了,在Silverlight中使用socket与服务器进行通信也是常见的需求,所以,作为.NET平台的通信框架,ESFramework支持Silverlight开发是必须的.       ESFramework.SL 即是ESFramework提供的Silverlight开发组件,其完整实现了基于流的TCP客户端网络引擎,并与其非Silverlight的接口完全一致(即是ESFramework 4.0 快速上手文中提到的IRapidPassi

ESFramework 4.0 快速上手(01) -- Rapid引擎

(在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强大,所以使用也较为复杂,配置也较多.但是如果我们的应用只是一个中小型的通信应用(同时在线5000人以下),直接使用ESPlatform就有点显得杀鸡用牛刀了.ESPlus.Rapid提供了一种快速的方式,来解决类似中小型的通信应用,以最简洁的方式来使用ESFramework. 使用ESPlus.Ra

ESFramework 4.0 快速上手(06) -- Rapid引擎(续)

<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家可以将这两个引擎看作是两个壳,内部包装的才是真正的ESFramework的网络引擎, ESFramework支持很多种网络引擎(客户端/服务端.二进制协议/文本协议.TCP/UDP),而RapidServerEngine和RapidPassiveEngine采用的是基于TCP和二进制协议的服务端引擎和客户端引

使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)

在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节点接收后,再反序列化为对象实例.在ESFramework体系中,也是遵循同样的规则.       ESFramework称这些需要经过网络传递的对象称之为协议类(Contract),协议类通常只是一个简单的数据结构封装,用于保存状态的一个哑类(不包含任何方法,从object继承的除外),有点类似于与

异常日志—— ESFramework 4.0 快速上手(03)

   ESFramework框架(包括ESPlus.ESPlatform)实现时就内置了相对完整的日志功能,几乎所有的异常(Exception)和错误信息都会被记录到日志.通过查看日志记录,我们可以了解到程序在运行的过程中出现了哪些非正常的状况,并且,详细的日志记录可以帮我们迅速定位问题,并解决问题.(关于我对日志记录的更多认识,可以参看我的博文我的架构经验小结(五)-- 日志记录 )   一.IAgileLogger接口     首先,ESFramework框架使用ESBasic.Logger

聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

      本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功能,可以先看看ESFramework 4.0 快速上手(13) -- 文件传送,如此简单一文的详细介绍.       本Demo可演示以下与文件传送相关的特性: (1)发送方请求发送文件,接收方可以同意或拒绝接收文件. (2)文件传送的过程中,收发的任何一方都可以通过事件了解文件传送的实

判定生死的心跳机制 --ESFramework 4.0 快速上手(07)

      在Internet上采用TCP进行通信的系统,都会遇到一个令人头疼的问题,就是"掉线".而"TCP掉线"这个问题远比我们通常所能想象的要复杂的多 -- 网络拓扑纷繁复杂.而从始节点A到终节点B之间可能要经过N多的交换机.路由器.防火墙等等硬件设备,每个硬件设备的相关设定也不统一,再加上网络中可能出现的拥塞.延迟等,使得我们在编程时,处理掉线也非常棘手.   一.从程序的角度看待TCP掉线       TCP掉线的原因可能多种多样.不一而足,比如,客人的电