.NET環境構建CAS客戶端

cbcgorilla發表於2008-06-24

仿照java版本的CAS客戶端過濾器,可在.NET環境中寫出具備同樣功能的CAS客戶端過濾元件。

主要部分有如下幾個功能類:

Utility.CasClient.UserAuthentication :CAS主要處理類

Utility.CasClient.Validator.ServiceTicketValidator:ticket驗證類

Utility.CasClient.Validator.ProxyTicketValidator:該類由ServiceTicketValidator派生,繼承ServiceTicketValidator中的主要驗證功能。

Utility.Http.HttpUtil:工具類,透過HTTP請求傳送並接受服務端資料。

Utility.CasClient.Handler.ITrustHandler:本地登入介面

下面給出主要處理類的程式碼,其他類可以根據java版本很容易改造出來。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Web;
using System.Web.SessionState;
using Utility.CasClient.Handler;
using Utility.CasClient.Validator;

namespace Utility.CasClient
{
/**
* 使用者身份驗證處理類
*/
public class UserAuthentication
{
//*********************************************************************
// Constants
public static String CAS_FILTER_USER = "edu.yale.its.tp.cas.client.filter.user";

private ITrustHandler handler;
private String casLogin, casValidate, casAuthorizedProxy, casServiceUrl, casRenew, casServerName;
private String redirectURL;
private String desktopURL;

public UserAuthentication()
{
handler = (ITrustHandler)Activator.CreateInstance(Type.GetType("Utility.CasClient.Handler.LocalTrustHandler"));

this.casLogin = "";
this.casValidate = "";
this.casServerName = "localhost:7010";
this.casServiceUrl = "";
this.redirectURL = "";
this.desktopURL = "Default.aspx";
this.casRenew = "false";
}

/**
* 登入入口
*/
public void Login(HttpContext context)
{
HttpRequest request = context.Request;
HttpResponse response = context.Response;
response.AddHeader("Pragma", "no-cache");
response.AddHeader("Cache-Control", "no-store");
response.Expires = -1;
HttpSessionState session = context.Session;
// 若會話資訊中使用者名稱已存在,則使用該使用者名稱直接登入本地系統。
if (session != null && session[CAS_FILTER_USER] != null)
{
String loginUser = session[CAS_FILTER_USER].ToString();
//使用CAS使用者登入本地系統
LoginToClientService(context, loginUser);
return;
}
// 根據當前傳入的ticket 獲取使用者登入名
String ticket = request.Params["ticket"];
if (ticket == null)
{
response.Redirect(casLogin + "?service=" + GetService(request));
}
else
{
String username = GetAuthenticatedUser(request);
if (username != null)
{
// 登入本地系統
if (session != null)
{
session.Add(CAS_FILTER_USER, username);
}
LoginToClientService(context, username);
}
}
}

/**
* 呼叫遠端SSO服務端Servlet驗證使用者Token,獲取使用者登入名。
*/
private String GetAuthenticatedUser(HttpRequest request)
{
ProxyTicketValidator pv = new ProxyTicketValidator();
pv.SetCasValidateUrl(casValidate);
pv.SetServiceTicket(request.Params["ticket"]);
pv.SetService(GetService(request));
pv.SetRenew(Boolean.Parse(casRenew));
pv.Validate();
if (pv.IsAuthenticationSuccesful())
{
return pv.GetUser();
}
else
{
return null;
}
}

/**
* 呼叫本地登入介面函式
*/
private void LoginToClientService(HttpContext context, String username)
{
if (username == null || username.Trim().Length == 0)
{
// send redirect;
}
else
{
int loginCode = handler.LoginWithUserName(context, username);
if (loginCode == 100)
{
context.Response.Redirect(desktopURL);
}
}
}

/**
* 獲取SSO服務地址
*/
private String GetService(HttpRequest request)
{
//TODO 新增GetService方法內容

return HttpUtility.UrlEncode(casServiceUrl);
}
}
}

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8700374/viewspace-1006078/,如需轉載,請註明出處,否則將追究法律責任。

相關文章