1. 程式人生 > >一個簡單單點登入SSO的實現(.net到j2ee)

一個簡單單點登入SSO的實現(.net到j2ee)

      單點登入實現的方式有很多,這裡介紹一種使用時間戳和md5加密的方式,實現了SSO整合端(由.net實現,在此稱為系統A)到應用系統B的單點登入(由j2ee實現,在此稱為系統B)。即登入了A系統,能通過A系統直接跳轉到B系統。

     其基本思路是:由系統A按照一定的規則構建帶引數的請求連線,該連線包含三個引數:使用者名稱auth_user, 時間戳auth_timestamp,以及由前兩者進行加密而得來的簽名auth_signature(本文采用了md5加密)。在系統B中,接收到訪問請求後,解析時間戳,時間戳的有效時間決定了該訪問連結是否合法,這也防止了有人直接複製連結訪問系統。時間戳有效後,使用使用者名稱和時間戳生成簽名,並校驗該簽名是否和請求連結的auth_signature一致,如果一致則是合法的SSO請求。

    該方法必須保持系統A/B的md5加密演算法完全一致。

    同時,該方法通過三方面保證了SSO安全性:1、時間戳有效性  2、簽名的唯一性    3、md5加密後字串處理可定製(A/B加密後字串再次處理)

    以下為具體實現步驟:

   1、系統A(SSO整合端)的處理和md5加密

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string host = "localhost:8080";
            string auth_user = "user_test";
            string auth_timestamp = (DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalSeconds - 28800).ToString().Split('.')[0]; ;
            string auth_signature = this.md5(auth_user + auth_timestamp).ToLower();
            string url = String.Format("http://{0}/auth/loginSSO?auth_signature={1}&auth_timestamp={2}&auth_user={3}"
                , host, auth_signature, auth_timestamp, auth_user).Replace("@", "%40");
            this.Label1.Text = url;
            Response.Redirect(url);

        }

        public String md5(String s)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
            bytes = md5.ComputeHash(bytes);
            md5.Clear();
            string ret = "";
            for (int i = 0; i < bytes.Length; i++)
            {
                ret += Convert.ToString(bytes[i], 16).PadLeft(2, '0');
            }
            return ret.PadLeft(32, '0');
        }

    }
}

2、對應的系統B(J2EE應用端,使用了Spring MVC)的處理

/**
	 * 單點登入
	 * @param request
	 * @param auth_signature 簽名
	 * @param auth_timestamp 時間戳
	 * @param auth_user 使用者名稱
	 * @param model
	 * @return
	 */
	@RequestMapping("/loginSSO")
	public String loginSystemBySSO(HttpServletRequest request,String auth_signature,String auth_timestamp,String auth_user,Model model){
		//校驗時間戳是否過期
		long curTime=System.currentTimeMillis()/1000;
		long abs=Math.abs(curTime-Long.parseLong(auth_timestamp));
		if(abs>3){
			model.addAttribute("errMsg", "時間戳過期!!!");
			return "login"; 
		}
		
		HttpSession session = request.getSession();
		SessionContainer sessionContainer = (SessionContainer) session.getAttribute("SessionContainer");
		if (null == sessionContainer)
			sessionContainer = new SessionContainer();
		UserInfo user = null;
		if (StrUtil.isEmpty(auth_user)) {
			model.addAttribute("errMsg", "使用者名稱不能為空!!!");
			return "login";
		} else {  
			DetachedCriteria criteria=DetachedCriteria.forClass(UserInfo.class);
			criteria.add(Restrictions.eq("loginName",auth_user));
			List<UserInfo> userlist=new ArrayList<UserInfo>();
		    userlist = (List<UserInfo>) userService.findByCriteria(criteria);
		    if(userlist.size()>0)
		    	user=userlist.get(0);
		}
		if (user==null) {
			model.addAttribute("errMsg", "使用者名稱或密碼錯誤!!!");
			return LOGIN;
		}
		//md5加密校驗合理性
		String md5Sig=MD5Util.MD5Encrypt(auth_user+auth_timestamp);
		if(!md5Sig.equals(auth_signature)){
			model.addAttribute("errMsg", "登入失敗,請聯絡管理員!!!");
			
		}		
		//sessionContainer.setIsLoginByIDCard("1");
		return authListAndSession(session, sessionContainer, model, user,"0");		
		
	}

  對應的md5加密工具類MD5Util.java為:

package com.test.framework.utils;

import java.security.MessageDigest;
import java.util.Arrays;

public class MD5Util {


	// 該方法將你輸入的字串,通過md5加密,返回一個加密後的字串
	public static String MD5Encrypt(String inStr) {
		MessageDigest md = null;
		String outStr = null;
		try {

			md = MessageDigest.getInstance("MD5"); // 可以選中其他的演算法如SHA
			byte[] digest = md.digest(inStr.getBytes("UTF-8"));
			//返回的是byte[],要轉化為String儲存比較方便
			outStr = bytetoString(digest);
		} catch (Exception nsae) {
			nsae.printStackTrace();
		}
		return outStr;
	}

	public static String bytetoString(byte[] digest) {
		String str = "";
		String tempStr = "";
		for (int i = 0; i < digest.length; i++) {
			tempStr = (Integer.toHexString(digest[i] & 0xff));
			//System.out.println(padLeft(tempStr, 2,'0'));
		    str = str + padLeft(tempStr, 2,'0');
		}
		return padLeft(str,32,'0');
	}

	private static String padLeft(String input, int size, char symbol) {
		while (input.length() < size) {
			input = symbol + input;
		}
		return input;
	}

}

相關推薦

一個簡單登入SSO實現.net到j2ee

      單點登入實現的方式有很多,這裡介紹一種使用時間戳和md5加密的方式,實現了SSO整合端(由.net實現,在此稱為系統A)到應用系統B的單點登入(由j2ee實現,在此稱為系統B)。即登入了A

javaWeb簡單登入sso實現方法

總結一個簡單的sso單點登入實現方法,先上一張思路圖:思路不復雜,在一個Filter中如下:String baseUrl="你的基礎系統路徑";//比如是120.24.270.95:8080 String host=request.getHeader("HOST"); S

PHP 登入SSO實現方式詳解

SSO( Single Sign On ),即單點登入,是一種控制多個相關但彼此獨立的系統的訪問許可權, 擁有這一許可權的使用者可以使用單一的ID和密碼訪問某個或多個系統從而避免使用不同的使用者名稱或密碼,或者通過某種配置無縫地登入每個系統 。 對於大型系統來

Java登入許可權系統—簡介

開源地址 部署文件 簡述 Smart定位用當下最流行的SSM(SpringMVC + Spring + Mybatis)技術,為您構建一個易理解、高可用、高擴充套件性的單點登入許可權管理應用基層,方便實現快速開發。許可權按鈕級(可控制到Cont

一個簡單的BitTorrent客戶端實現:peer manager和peer實現

peer manager和peer peer是整個BT通訊中最複雜的部分,主要是裡面各種訊息的傳送和一些choke和unchoke策略,piece選擇策略等等。peer manager用於管理peer,本程式中維護多個peer進行遠端通訊。 peer實現

一個簡單的BitTorrent客戶端實現:tracker manager和tracker實現

關於tracker和tracker manager tracker在整個bt協議中起著很重要的作用,從tracker那裡我們可以獲取當前正在下載的peer列表,從而與它們互動,進行檔案的上傳和下載。TrackerManager顧名思義就是管理tracker的。

一個簡單的BitTorrent客戶端實現:種子檔案解析及資訊儲存

關於種子檔案 BT的種子檔案一般是以.torrent作為字尾的。關於種子檔案的編碼,這裡不再做任何介紹。本程式採用的測試種子檔案為ubuntu-14.04.3-desktop-i386.torrent,各位可以到http://mirrors.163.com/u

利用spring+springMvc對登入(SSO)的簡單實現含原始碼

一、簡介       繼上一次的第三方登入後,趁熱打鐵,繼續學習了一下單點登入。和oauth2.0的原理有些相似。都是客戶端登入的時候需要去服務端認證一下。認證通過才能進行登入。不同的是,單點登入需要自己去維持一個認證伺服器與使用者瀏覽器的全域性會話、客戶端端與使用者瀏覽器的

基於CAS的登入SSO[5]: 基於Springboot實現CAS客戶端的前後端分離

基於CAS的單點登入SSO[5]: 基於Springboot實現CAS客戶端的前後端分離 作者:家輝,日期:2017-08-24 CSDN部落格: http://blog.csdn.net/gobitan 摘要:現在大部分系統的開發都已經

CAS實現登入SSO執行原理探究(終於明白了)

一、不落俗套的開始 1、背景介紹 單點登入:Single Sign On,簡稱SSO,SSO使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 CAS框架:CAS(Central Authentication Service)是實現S

登入SSO實現原理

單點登入SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。單點登入在大型網站裡使用得非常頻繁,例如像阿里巴巴這樣的網站,在網站的背後是成百上千的子系統,使用

登入SSO實現方式

    這個文章我們來討論一下單點登入SSO的一些實現方式,其中包括對session和cookie的一些討論。 一、     我們知道http協議是無狀態的協議,也就是說一次請求對應一次響應,不和這次請求的上一次和下一次請求產生關聯。那麼這樣就有一個問題,比如說,我們想實現

SSO登入實現

這種方式需要我們藉助一個單獨的SSO服務,專門做驗證用。而且我們還需要對於不同的站點的使用者要有一個統一的使用者資料。這種方式瀏覽器只需要儲存SSO服務站點的cookie資訊。將這個cookie資訊用於其他站點從而實現單點登入。我們暫且將這個SSO服務站點成為www.SSO

.Net 登入(SSO)的原理與實現------登入是什麼鬼

.Net 單點登入(SSO)的原理與實現——單點登入是什麼鬼 一、什麼是單點登入   在一些公司中,可能需要按照公司業務將系統拆分,例如騰訊的產品有騰訊視訊、QQ郵箱、QQ空間等;百度有百度貼吧,百度知道;阿里有淘寶、天貓….我們常常是登入了淘寶就可以直接進

16、SpringBoot登入SSO資料庫實現

    首先以一張圖形式說明單點認證的整個流程:    前一篇文章中,我們使用了記憶體寫死的模式實現使用者的授權和資源的保護,當然token以及clients資訊儲存有多種方式,有inmemory記憶體模式、redis儲存模式、jdbc儲存模式、jwt儲存模式、jwk儲

.NET基於Redis快取實現登入SSO的解決方案

一、基本概念 最近公司的多個業務系統要統一整合使用同一個登入,這就是我們耳熟能詳的單點登入,現在就NET基於Redis快取實現單點登入做一個簡單的分享。 單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義

基於IdentityServer4的OIDC實現登入(SSO)原理簡析

# 寫在前面 IdentityServer4的學習斷斷續續,兜兜轉轉,走了不少彎路,也花了不少時間。可能是因為沒有閱讀原始碼,也沒有特別系統的學習資料,相關文章很多園子裡的大佬都有涉及,有系列文章,比如: 曉晨大佬的:https://www.cnblogs.com/stulzq/p/8119928.ht

如何設計一個登錄系統3

抽象 pat resolve pro 業務 問題 resolv -c cli 在上一篇文章 如何設計一個單點登錄系統(2)? 中主要講解了可跨域SSO系統服務端,客戶端在登錄,登出過程中分別應該承擔的職責,本文將重點聊一下具體技術實現,源碼地址: https://githu

如何設計一個登錄系統1

ping 微信 根據 files 示例 o-c 基本 形式 TP 單點登錄系統的由來 隨著互聯網技術的發展,目前各大公司都在瘋狂擴張業務,比如像阿裏巴巴,旗下就有淘寶,天貓,支付寶等業務線,按照目前的互聯網產品,基本上每個產品都會涉及到賬戶體系,不管是社交也好,電商也罷,都

基於CAS的登入SSO[4]: 加入兩個CAS客戶端測試登入

基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入 作者:家輝,日期:2017-08-22 CSDN部落格: http://blog.csdn.net/gobitan 摘要:本系列的前三篇文章分別搭建了基於CAS的單點登入伺服器,並讓伺