分享

盛大通行证统一认证

 richsky 2012-04-07
Web平台上的应用

基于Web平台的应用通过CAS(Central Authentication Service,是盛大通行证在Web应用中的统一认证系统。)完成盛大通行证用户的认证过程。

具体流程如下图:


1、用户在合作伙伴的Web应用页面中选择登录盛大通行证,浏览器跳转到盛大CAS认证页面。

2、用户在盛大CAS页面中登录盛大通行证。

3、登录后浏览器跳转回进入CAS之前的合作伙伴Web应用页面,并在地址上追加验证Token(Ticket参数)。

4、合作伙伴后台服务器访问CAS验证接口,并提交Ticket参数值。

5、获得验证结果(盛大通行证标识),登录完成

流程详述

盛大通行证CAS登录界面

接入方在应用界面中提供登录盛大通行证的方式(比如链接或按钮),用户选择登录盛大通行证后,将用户定向到CAS登录接口地址:

开发、测试环境:

https://cas.qftdev.sdo.com:8443/cas/login?service={0}

正式环境: https://cas.sdo.com:8443/cas/login?service={0}

其中,跳转前需将{0}替换成认证成功后返回的地址(注意参数需进行UrlEncode),通常为跳转到盛大通行证认证页面前的访问地址。

用户在CAS完成认证过程后,将重定向回{0}部分指定的地址,并且地址的后面将跟上用于取得认证结果的ticket参数。

访问正式环境前,需事先将合作方应用地址提交盛大审核。访问正式环境的应用地址URL必须使用域名,不允许使用IP访问。

代码示例
HTML Code
<a href='https://cas.sdo.com:8443/cas/login?service=http%3A%2F%2Fwww.youdomain.com'>登录盛大通行证</a>

取得CAS认证结果

根据上节描述,用户在CAS中央认证服务器认证成功后,用户浏览器将导回原service参数指定的地址,并带有ticket参数。

此时,用户请求的地址重回接入方应用,接入方应用在收到请求后,需使用请求地址中的ticket参数去CAS认证结果。

跟上节描述不同,此是不再是将用户重定向到CAS地址,而是在响应用户请求前,由服务器端直接去CAS请求认证结果。

请求认证结果的地址如下:

开发、测试环境:https://cas.qftdev.sdo.com:8443/cas/Validate.SDID?service={0}&ticket={1}

正式环境:https://cas.sdo.com:8443/cas/Validate.SDID?service={0}&ticket={1}

其中{0}部分替换为和上节流程中使用的service参数相同的内容,{1}部分替换成请求查询字符串中的ticket参数的值。 必须{0}部分内容与上节中的service参数完全一致,否则可能导致验证失败!

请求这一地址后,得到的响应体内容为一个XML字符串:

如下为验证成功返回的结果:

XML Code
<result>
    <success>true</success>
    <sdid>ABDE1234ABDE1234ABDE1234ABDE1234</sdid>
    <attributes>
        <attribute name=”roleGrade”>32</attribute>
        <attribute name=”alias”>血牛一号</attribute>
    </attributes></result>

其中success元素指示验证时否成功,sdid元素指示用户登录的盛大通行证账号标识。此外,attributes元素可以根据游戏的需求,返回不同的用户相关参数。

以下为验证失败返回的结果:

XML Code
 <result>
    <success>false</success>
    <code>3</code>
    <descript>调用错误 Ret=逻辑错误,命令字:0x4615 Desc=逻辑错误,
                命令字:0x4615    </descript></result>

接入程序根据返回的XML内容分析获得认证结果。

对获得认证结果实现的示例代码
C#
C# Code
    private void GetCASAuthenResult()
    {
        string ticket = Request.QueryString["ticket"];
        //针对https的处理
        ServicePointManager.ServerCertificateValidationCallback 
            = new RemoteCertificateValidationCallback(
                AcceptAllCertificatePolicy2.CheckValidationResult);
 
        WebClient request = new WebClient();
        //path为认证时传递的service参数
        string encodedPath = HttpUtility.UrlEncode(path);
 
        //获得认证结果
        byte[] buffer = request.DownloadData(string.Format(
          "https://dev.cas.sdo.com:8443/cas/Validate.SDID?service={0}&ticket={1}",
          encodedPath, ticket));
 
        string result = Encoding.GetEncoding("gb2312").GetString(buffer);
 
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(result);
        XmlNode success = doc.SelectSingleNode("//success");
 
        if (string.Equals(success.InnerText, "true", 
               StringComparison.OrdinalIgnoreCase))
        {
            string sdid = doc.SelectSingleNode("//sdid").InnerText;
            FormsAuthentication.SetAuthCookie(sdid, false);
        }
    }

如果是.NET 2.0程序,请求https地址时,可能需要用到一个策略类,实现方式类似以下代码:

C# Code
using System;;using System.Web;using System.Web.Security;using System.Security.Cryptography.X509Certificates;using System.Net.Security;
 /// <summary>/// 服务器证书认证, For 2.0/// </summary>public class AcceptAllCertificatePolicy2{
 
    /// <summary>
    /// 服务器证书认证, For 2.0
    /// </summary>
    public static bool CheckValidationResult(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors errors)
    {
        // Always accept   
        return true;
    }}

用户注销

如果用户在游戏中做了注销的动作,此时盛大产品(CAS)并不能得到用户注销的动作通知,所以就会有游戏已注销,而圈圈没有注销,用户再使用盛大通行证登录就会直接使用原来的登录状态登录,而不是再次进入登录界面的情况。

为保证所有基于CAS的应用均处于注销状态,合作方应用需在本应用注销用户状态后,将用户重定向到以下地址,使得包括游戏和圈圈在内的所有应用均注销其登录状态:

开发、测试环境:https://pt.qftdev.sdo.com:8443/cas/logout?url=http%3a%2f%2fwww.youdomain.com

正式环境:https://cas.sdo.com:8443/cas/logout?url=http%3a%2f%2fwww.youdomain.com

其中URL参数为CAS完成注销后返回的地址,此参数需UrlEncode。

示例代码
ASP.NET

aspx

HTML Code
<asp:LinkButton ID="lbtnLogout" runat="server" OnClick="lbtnLogout_Click">注销</asp:LinkButton>

aspx.cs

C# Code
    protected void lbtnLogout_Click(object sender, EventArgs e)
    {
        //将用户状态改为未登录
        FormsAuthentication.SignOut();
        Response.Redirect("https://cas.sdo.com:8443/cas/logout?url=http%3a%2f%2fwww.youdomain.com");
    }
示例代码
ASP

<% Session.Abandon %> appLogout(0);

客户端程序形式应用

用户认证是基于盛大通行证实现的统一的,单点登陆的用户认证系统,为用户支付、计费提供基础服务。

接入应用需通过IGW的接口启动认证过程,并通过盛大产品服务端组件完成认证结果的获取,所以实施认证之前,需保证客户端成功加载了IGW组件,服务器端成功加载了盛大产品服务端组件。


以游戏为例,具体的流程如下:

1、游戏客户端调用IGW的ShowLoginDialog函数,将盛大认证界面呈现给用户。

2、用户完成认证过程后,IGW将认证结果返回给游戏客户端。

3、游戏客户端将认证返回的Token、UserId、IDCARD(如果用户登记了身份证号,则此参数返回用户身份证号)参数提交到游戏服务端,游戏服务端调用的盛大产品服务端组件的VerifyAuthentication函数,启动验证认证结果过程。

4、认证组件验证认证结果是否合法并将验证结果返回给游戏客户端。

在游戏完成登录后,圈圈 也会变成已登录状态,如果消销用户登录,则需调用IGW组件中的Logout函数。

接口函数

在进行盛大通行证用户认证过程中,需调用GameWidget.dll和盛大产品服务端组件(分为COM形式的版本:SDOServerCOM.dll和DLL形式的版本:SDOServerDLL.dll)中的函数。其中GameWidget.dll将被布署于客户端,而盛大产品服务端组件将布署于应用服务端。

ShowLoginDialog

GameWidget.dll中的显示登录对话框的接口函数。

C++ Code
int WINAPI ShowLoginDialog(const LOGINCALLBACKPROC Callback, int UserData, int Reserved);
参数说明
参数名类型说明备注
CallbackLOGINCALLBACKPROC回调函数
UserDataint用户数据,在Callback中传回
Reservedint保留未用填0
返回值

返回0表示成功,不等于0表示失败。

调用示例

/*缺代码*/

VerifyToken

盛大产品服务端组件中的VerifyToken函数在用户登录盛大通行证时,验证并获得认证结果。由接入应用的登录服务器端程序使用。

参数说明
参数名类型说明备注
IPBSTR盛大通行证验证服务器IP或者域名测试环境为61.172.247.235,正式环境为qftverify.sdo.com
PortBSTR盛大通行证验证服务器端口测试环境和正式环境均为8010
ResultBSTR *验证结果<0 未知错误,静态库调用失败

0 验证成功,返回格式为: 0^$^USERID^$^IDCARD 其中USERID为32位的帐户唯一标识,IDCARD为帐户对应的防沉迷身份证信息

1 内容或者签名为空

2 该签名已经验证过

3 签名验证失败

4 解析内容失败或者内容格式不对

5 超时

6 系统错误

7 socket error。7^$^SendMessage失败:错误码

返回值

返回0表示成功,不等于0表示失败。

调用示例

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多