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

时间: 2024-08-01 07:51:52

SSO单点登录之Asp.Net实现示例的相关文章

cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)

转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标: 下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一名合格的用户,我表示很不开心. 于是,打开 Nodepad++,寻找C:\tomcat7\webapps\casServer\WEB-INF\view\jsp\default\ui \casLoginView.jsp这个页

NET Core 2.0使用Cookie认证实现SSO单点登录

NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NET Core 2.0出来了试着使用ASP.NET Core尝试一下.假如我们有三个站点 domain.dev order.domain.dev passport.domain.dev domain.dev作为我们的主站肯定是可以匿名访问

sso单点登录

单点登录SSO的实现原理 单点登录SSO SSO单点登录.跨域重定向.跨域设置Cookie.京东单点登录实例分析

SSO单点登录原理及实现

1.SSO分类 根据实现的域不同,可以把SSO分为同域SSO.同父域SSO.跨域SSO三种类型. 2.SSO实现原理 a.打开统一的登录界面 b.登录,同时向服务器写入Cookie c.进入其他应用 d.判断是否有对应的Cookie 如果没有则进入统一的登录界面 如果有则进入下一步验证 e.服务器验证Cookie的有效性 如果有效则进入下一步 如果无效则打开统一的登录界面 f.成功进入应用页面 3.同域SSO的实现 a.定义一个公共的登录页面 登录页面是通过访问不同路径的action跳转而来.

CAS实现SSO单点登录原理

1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ). CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目. 1.2.  主要特性 1.   开源的.多协议的 SSO 解决方案: Protocols : Custom Protoc

学习CAS实现SSO单点登录

网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 3.CAS单点登录(SSO)完整教程 有可能出现的问题解决方案: 1.unable to find valid certification path to requested target javax.net.ssl.SSLHandshakeException: sun.security.validator.Validator

SSO单点登录三种情况的实现方式详解

单点登录(SSO——Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子系统——百度经验.百度知道.百度文库等等,如果我们使用这些系统的时候,每一个系统都需要我们输入用户名和密码登录一次的话,我相信用户体验肯定会直线下降.当然,对于个人博客这类系统来说根本就用不上单点登录了. 假如,我们的系统很庞大,但是就是这一个系统,并没有什么子系统.这时我们也不需要单点登录.我们需要的是搭建集群环境,这里虽说只有一个系

SSO(单点登录)与旅游年卡

SSO(单点登录)与旅游年卡 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一.(来自百度百科) 旅游年卡:一次办卡,多个景点游玩.避免了每个景点排队买票浪费时间影响心情. 我喜欢逛,07年广州一行让我爱上了旅行.十年间转战祖国大江南北.东到浙江苏州上海,南到广东珠海澳门,西到宜昌长江三峡,北到首都长

ofbiz SSO 单点登录

 1.ofbiz单点登录介绍 ofbiz点单登录是集成了CAS SSO,LDAP使用的,具体的CAS与LDAP怎么应用,在这里不做介绍. 2.ofbiz点单登录文档 ofbiz 12版本中,有英文的简单的ofbiz单点登录的问题. 路径在:apache-ofbiz-12.04.01\framework\documents\SingleSignOn.xml 3.ofbiz单点登录目录 ofbiz  单点登录集成的目录在:apache-ofbiz-12.04.01\specialpurpose\