SSO單點登入之Asp.Net實現樣本

來源:互聯網
上載者:User

標籤:ram   web   ken   key   index   需要   oca   count   配置   

一、什麼是單點登入SSO(Single Sign-On)

SSO是一種統一 認知 和授權機制,指訪問用同一伺服器不同應用中的受保護資源的同一使用者,只需登入一次,即通過一個應用中的安全驗證 後,再訪問其他 應用中的受保護資源時,不再需要重新 登入驗證。

註:

1.所有應用 系統共用一個身份認證系統。

2.所有應用系統能夠 識別和提取ticket資訊。

二、實現過程 及原理說明

1.Session_Server項目作為使用者認證系統,其他網站也使用它作為使用者認證

2.對於同一個瀏覽器 的同一次會員,總是帶有相同的 Asp.Net_SessionID,作為ticket憑據,當 用於登入後將這個sessionid標記已經登入,其他系統訪問先判斷sessionid是否登入,如果 是 自動登入

3.對於Session_Server項目的處理,幕後處理登入邏輯配置指定網域名稱可訪問、可帶Cookie資訊,前台Ajax請求需要待著Cookie,不然每次請求都返回不同的sessionid。

三、代碼執行個體:

Git地址 :http://git.oschina.net/tiama3798/WebAPI_Demo

後台:

    /// <summary>    /// 單點登入,介面封裝    /// </summary>    [EnableCors("*", "*", "*")]    public class LoginController : BaseController    {        /// <summary>        /// 擷取當前Session的ID        /// </summary>        /// <returns></returns>        [EnableCors("*", "*", "*", SupportsCredentials = true)]        public string GetSessionID()        {            return _Session.SessionID;        }        LogHelper.LogHelper _log = new LogHelper.LogHelper();        /// <summary>        /// 判斷當前回話的使用者是否已經登入        /// </summary>        /// <returns></returns>        public string GetLogin(string sessionid)        {            //1.擷取所有Session內容            foreach (var item in _Application.AllKeys)            {                if (item == sessionid)                {                    AccountInfo acount = _Application[item.ToString()] as AccountInfo;                    if (acount != null && acount.SessionID == sessionid)                    {                        return acount.ToJsonString();                    }                }            }            return "0";        }        /// <summary>        /// 判斷處理使用者登入        /// </summary>        /// <param name="username"></param>        /// <param name="pwd"></param>        /// <returns></returns>        public string CheckUser()        {            string token = ReqHelper.GetString("token");            string username = ReqHelper.GetString("username");            string pwd = ReqHelper.GetString("pwd");            if (pwd == "123")            {                //登入成功,返回cookie的值                _Application.Add(token, new AccountInfo()                {                    UserName = username,                    SessionID = token                });                return $"username={username}&sessionid={token}";            }            return "0";        }        /// <summary>        /// 登入使用者資訊        /// </summary>        public class AccountInfo        {            public string UserName { get; set; }            public string SessionID { get; set; }        }    }

前台:

/*** 單點登入封裝*/(function () {    var urlHelper = {        //擷取網域名稱        getDomain: function () {            if (location.host.indexOf(‘localhost‘)!=-1)                return ‘http://localhost:62087/‘;            return ‘http://www.s.com/‘;        },        getController: function (controller) {            return this.getDomain() + controller;        },        getAction: function (controller, action) {            var url = this.getDomain();            if (controller)                url += controller + ‘/‘;            if (action)                url += action + ‘/‘;            return url;        }    }    var accountOperate = {        //1.擷取當前回話id        getSessionID: function (successCB) {            var _this = this;            ////判斷id是否已經存在,如果已經存在不在請求            //$.get(urlHelper.getAction("login", ‘GetSessionID‘), {            //}, function (data) {            //    if (successCB)            //        successCB(data);            //    //儲存在本地            //    $.cookie(‘_token_‘, data, { path: ‘/‘ });            //});            //因為跨域所以需要待著cookie            $.ajax({                url: urlHelper.getAction("login", ‘GetSessionID‘),                data: {},                xhrFields: {                    withCredentials: true  //支援附帶詳細資料                },                crossDomain: true,//請求偏向外域                success: function (data) {                    if (successCB)                        successCB(data);                    //儲存在本地                    $.cookie(‘_token_‘, data, { path: ‘/‘ });                }            });        },        //擷取cookie中的sessionid        getToken: function () {            return $.cookie(‘_token_‘);        },        //判斷token的使用者是否登入        getinfo: function (token, callBack) {            var _this = this;            if (token) {                console.info(urlHelper.getAction("login", ‘GetLogin‘));                $.get(urlHelper.getAction("login", ‘GetLogin‘), {                    sessionid: token                }, function (data) {                    if (callBack)                        callBack(data);                });            }        },        //初始化登入處理        login_init: function (errorCB, sucessCB) {            var _this = this;            //判斷是否登入            if (_this.getuser()) {            } else {                //擷取token                _this.getSessionID(function (sessionid) {                    //擷取登入資訊                    //alert(sessionid);                    console.info(sessionid);                    _this.getinfo(sessionid, function (data) {                        if (data != 0) {                            $.cookie(‘user‘, data);                        }                    });                });                          }        },        //判斷使用者是否已經登入        getuser: function () {            console.info(this.getToken());            return $.cookie(‘user‘);        },        //指定使用者名稱密碼,登入使用者        checkuser: function (username, pwd, sucessCB) {            var _this = this;            $.post(urlHelper.getAction("login", ‘checkuser‘), {                token: _this.getToken(),                username: username,                pwd: pwd            }, function (data) {                if (data == ‘0‘) {                    alert(‘登入失敗‘);                    //if (callBack) callBack(data);                } else {                    if (sucessCB) sucessCB(data);                }            });        }    }    window.account = accountOperate;})();

更多:

Asp.Net WebApi開啟Session回話

Asp.Net WebApi 啟用CORS跨域訪問指定多個網域名稱

Ajax跨域請求中的Cookie問題(預設不帶cookie等憑證)

更多參考:

http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html

http://www.cnblogs.com/heyangyi/p/5700644.html

SSO單點登入之Asp.Net實現樣本

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.