CAS单点登录实现(C++版)

1 篇文章 0 订阅
1 篇文章 0 订阅

网上有关于JAVA、PHP、.Net的CAS单点登录客户端的实现方式,用C++客户端实现的例子少之又少。下面针对这方面的稀缺,整理了一份实现流程。
开发平台:VS2008
开发语言:C++
外部包引用:curl-7.29.0、openssl-1.0.1e 
CAS服务版本:3.5.1


在curl工程设置的预处理中添加USE_SSLEAY与USE_OPENSSL两个宏与libeay32.lib ssleay32.lib两个库文件,让curl支持openssl,需要重新编译链接。


在进行CAS登录及验证的过程中最重要的几个数据是:TGT、JSESSIONID


TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。


一、通过GET方式后台获取JSESSION、LT与execution

//获取Response数据回调

size_t URL_writefunc(void *ptr, size_t size, size_t nmemb, struct mystring *s)
{
size_t new_len = s->len + size*nmemb;
s->ptr = realloc(s->ptr, new_len+1);
if (s->ptr == NULL)
return -1;
memcpy(s->ptr+s->len, ptr, size*nmemb);
s->ptr[new_len] = '\0';
s->len = new_len;

return size*nmemb;
}

//在进行Request时所需要的一些参数
curl_easy_setopt(u->curl, CURLOPT_URL, url);      //CAS服务登录地址 https://{CAS域名}/login
curl_easy_setopt(u->curl, CURLOPT_WRITEFUNCTION, URL_writefunc);     //获取Response数据回调
curl_easy_setopt(u->curl, CURLOPT_WRITEDATA, out);        //Response数据存储字符串
curl_easy_setopt(u->curl, CURLOPT_FOLLOWLOCATION, TRUE);        //捕获重定向URL的信息
curl_easy_setopt(u->curl, CURLOPT_SSL_VERIFYPEER, FALSE);    //如果数字证书不完整时可设置为FALSE,不进行验证
curl_easy_setopt(u->curl, CURLOPT_HEADER, TRUE);            //Response数据中包含HEADER信息,为了更方便的获取JSESSIONID信息

//发送登录Request
u->res = curl_easy_perform(u->curl);



从返回的Response(CAS的登录页面)中提取JSESSIONID、LT与execution信息。


二、通过POST的方式进行登录请求,并获取TGT
//后台登录所需参数
postfield="username=a&password=a<=LT-110-DLro3EN3p5BuHslQAAk6helHAU2bmP&execution=e1s1&_eventId=submit&submit=login"
//Cookie信息
cookie="JSESSIONID=F5D3585514062FDB074B4A5D097ED1C1"

curl_easy_setopt(c->u.curl, CURLOPT_POSTFIELDS, postfield);  //设置POST参数,在网上找到用CURLOPT_HTTPPOST方式传参的例子,可惜在测试过程中服务端会报login map{empty}的错误。
curl_easy_setopt(c->u.curl, CURLOPT_COOKIE, cookie);   //在进行后台登录时cookie信息是非常重要,不然无法成功
curl_easy_setopt(c->u.curl, CURLOPT_HEADER, TRUE);   //Response数据中包含HEADER信息,为了更方便的获取TGT信息
curl_easy_setopt(u->curl, CURLOPT_FOLLOWLOCATION, TRUE); 
curl_easy_setopt(u->curl, CURLOPT_WRITEFUNCTION, URL_writefunc);
curl_easy_setopt(u->curl, CURLOPT_WRITEDATA, out);
curl_easy_setopt(u->curl, CURLOPT_SSL_VERIFYPEER, FALSE);

u->res = curl_easy_perform(u->curl);



登录成功后从返回的Response中提取TGT信息,在HEADER中的字段名为CASTGC。


三、用户身份验证

在进行用户身份验证时需要用的信息如下
JSESSIONID=F5D3585514062FDB074B4A5D097ED1C1;
CASTGC=TGT-42-09K6HQRjMHgdYtsBeONUAIpRzfsEYd6ROST6j3CuB5f7x0rVbO-cas01.example.org

如果需要让一个新打开的WEB页面能进行用户身份验证,则必须通过InternetSetCookie方法将以上信息保存到Cookie中传到页面中。
https://{CAS域名}/login?service=http://{URL}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动端CAS单点登录实现可以参考以下步骤: 1. 配置CAS服务器:首先,你需要搭建CAS服务器并进行相关配置。CAS服务器负责用户认证和授权,并生成和验证票据。 2. 移动端应用集成CAS客户端:在移动端应用中集成CAS客户端库,以便与CAS服务器进行通信。你可以使用现有的CAS客户端库,如CAS Client for Java、CAS Client for iOS等。 3. 用户登录:当用户在移动端应用中进行登录时,应用会将用户凭证发送到CAS服务器进行认证。CAS服务器验证用户凭证的有效性,并生成一个票据(Ticket)。 4. 获取票据:移动端应用通过CAS客户端库获取由CAS服务器生成的票据。 5. 向移动端应用服务器发送票据:移动端应用将票据发送给应用后端服务器,以便后续的认证和授权操作。 6. 应用后端服务器验证票据:应用后端服务器通过CAS客户端库验证移动端应用发送的票据的有效性。如果票据有效,说明用户已经通过CAS认证,可以继续处理后续的业务逻辑。 7. 完成单点登录:一旦用户在移动端应用中成功完成CAS认证,在同一CAS域下的其他应用也可以通过这个票据来实现单点登录。这是因为其他应用也会使用CAS客户端库来验证票据的有效性。 需要注意的是,CAS单点登录的具体实现可能因为技术栈和业务需求的不同而有所差异。上述步骤提供了一个基本的参考,你可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值