zoukankan      html  css  js  c++  java
  • SSO单点登录之Asp.Net实现示例

    一、什么是单点登录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

  • 相关阅读:
    阅读计划
    第一课 课堂练习总结
    人月神话读后感
    软件工程概论11-软件演化
    【HDU4366】【DFS序+分块】Successor
    【转载】【元胞自动机】生命游戏(时间简史)
    【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
    【BZOJ3295】【块状链表+树状数组】动态逆序对
    【HDU4391】【块状链表】Paint The Wall
    【POJ2887】【块状链表】Big String
  • 原文地址:https://www.cnblogs.com/tianma3798/p/7236838.html
Copyright © 2011-2022 走看看