基于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# Codeusing 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++ Codeint WINAPI ShowLoginDialog(const LOGINCALLBACKPROC Callback, int UserData, int Reserved);
参数说明
参数名 | 类型 | 说明 | 备注 |
---|
Callback | LOGINCALLBACKPROC | 回调函数 |
|
UserData | int | 用户数据,在Callback中传回 |
|
Reserved | int | 保留未用 | 填0 |
返回值
返回0表示成功,不等于0表示失败。
调用示例
/*缺代码*/
VerifyToken
盛大产品服务端组件中的VerifyToken函数在用户登录盛大通行证时,验证并获得认证结果。由接入应用的登录服务器端程序使用。
参数说明
参数名 | 类型 | 说明 | 备注 |
---|
IP | BSTR | 盛大通行证验证服务器IP或者域名 | 测试环境为61.172.247.235,正式环境为qftverify.sdo.com |
Port | BSTR | 盛大通行证验证服务器端口 | 测试环境和正式环境均为8010 |
Result | BSTR * | 验证结果 | <0 未知错误,静态库调用失败 0 验证成功,返回格式为: 0^$^USERID^$^IDCARD 其中USERID为32位的帐户唯一标识,IDCARD为帐户对应的防沉迷身份证信息 1 内容或者签名为空 2 该签名已经验证过 3 签名验证失败 4 解析内容失败或者内容格式不对 5 超时 6 系统错误 7 socket error。7^$^SendMessage失败:错误码 |
返回值
返回0表示成功,不等于0表示失败。
调用示例