C# 单点登录 MVC
跨应用、跨域、跨机器的单点登录。
1、流程:
a) 用户直接访问门户url,登录成功后跳转到默认应用的url。






[NeedUrlAuthorized] 需要进行Url验证 (首先会要求需要登录)
[HttpPost]
public ActionResult User(Friend.Models.User model)





d) 用户已经登录,用户直接访问用户有权限的应用url,通过。



//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2013 , Hairihan TECH, Ltd.
//----------------------------------------------------------------- using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic; namespace DotNet.Business
{
using DotNet.Utilities; /// <summary>
/// BaseUserManager
/// 用户管理
///
/// 修改纪录
///
/// 2013.08.17 版本:1.0 JiRiGaLa 用户登录后才设置验证码、获取验证码等。
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2011.10.17</date>
/// </author>
/// </summary>
public partial class BaseUserManager : BaseManager
{
#region public int SetVerificationCode(string userId, string verificationCode) 设置验证码
/// <summary>
/// 设置验证码
/// </summary>
/// <param name="userId">用户主键</param>
/// <param name="verificationCode">验证码</param>
/// <returns>影响行数</returns>
public int SetVerificationCode(string userId, string verificationCode)
{
int result = ;
if (string.IsNullOrEmpty(userId) && this.UserInfo != null)
{
userId = this.UserInfo.Id;
}
string sqlQuery = string.Empty;
sqlQuery = " UPDATE " + BaseUserLogOnEntity.TableName
+ " SET " + BaseUserLogOnEntity.FieldVerificationCode + " = " + DbHelper.GetParameter("VerificationCode")
+ " WHERE " + BaseUserLogOnEntity.FieldId + " = " + DbHelper.GetParameter("UserId"); List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(DbHelper.MakeParameter("VerificationCode", verificationCode));
dbParameters.Add(DbHelper.MakeParameter("UserId", userId));
result = DbHelper.ExecuteNonQuery(sqlQuery, dbParameters.ToArray());
return result;
}
#endregion #region public bool Verify(string userId, string verificationCode)
/// <summary>
/// 验证,验证码是否正确
/// </summary>
/// <param name="userId">用户主键</param>
/// <param name="verificationCode">验证码</param>
/// <returns></returns>
public bool Verify(string userId, string verificationCode)
{
bool result = false;
string sqlQuery = string.Empty;
// 最后一次登录时间
sqlQuery = " SELECT COUNT(1)"
+ " FROM " + BaseUserLogOnEntity.TableName
+ " WHERE " + BaseUserLogOnEntity.FieldVerificationCode + " = " + DbHelper.GetParameter("VerificationCode")
+ " AND " + BaseUserLogOnEntity.FieldId + " = " + DbHelper.GetParameter("UserId"); List<IDbDataParameter> dbParameters = new List<IDbDataParameter>();
dbParameters.Add(DbHelper.MakeParameter("VerificationCode", verificationCode));
dbParameters.Add(DbHelper.MakeParameter("UserId", userId));
object exist = DbHelper.ExecuteScalar(sqlQuery, dbParameters.ToArray());
if (exist != null)
{
if (BaseSystemInfo.OnLineLimit <= int.Parse(exist.ToString()))
{
result = true;
}
}
return result;
}
#endregion
}
}
3、提供远程访问接口:用户信息的访问;权限信息的访问。访问方式可以是Webservice的方式,封装成一个访问类,方便别人调用。
//-----------------------------------------------------------------------
// <copyright file="FriendFansManager.Auto.cs" company="Hairihan">
// Copyright (c) 2013 , All rights reserved.
// </copyright>
//----------------------------------------------------------------------- using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using DotNet.Business; namespace Friend
{
/// <remarks>
/// PermissionWebService
/// 权限检查的WebService
///
/// 修改纪录
///
/// 2013.08.17 版本:1.0 JiRiGaLa 更新审核意见。
///
/// 版本:1.0
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2013.08.17</date>
/// </author>
/// </remarks>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class PermissionService : System.Web.Services.WebService
{
// 如果当前用户没登录后台的权限
DotNet.Business.PermissionService permissionService = new DotNet.Business.PermissionService(); // 如果当前用户登录
// DotNet.Utilities.BaseUserInfo userInfo = Utilities.CheckCookie(HttpContext.Current.Request); public PermissionService()
{
/*
if (userInfo != null && !string.IsNullOrEmpty(userInfo.Code))
{
if (!string.IsNullOrEmpty(permissionItemCode))
{
bool permissionAdmin = permissionService.IsAuthorizedByUser(userInfo, userInfo.Id, permissionItemCode, string.Empty);
if (!permissionAdmin)
{
throw new Exception("没有权限访问。");
}
}
}
else
{
throw new Exception("没有权限访问。");
}
*/
} #region public bool IsUserInRole(string systemCode, string userId, string roleCode)
/// <summary>
/// 用户是否在某个角色里
/// </summary>
/// <param name="systemCode">子系统编号</param>
/// <param name="userId">用户主键</param>
/// <param name="roleCode">角色编号</param>
/// <returns>是否在某个角色里</returns>
[WebMethod]
public bool IsUserInRole(string systemCode, string userId, string roleCode)
{
// 需要创建个用户对象
DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo();
// 若没指定是哪个子系统,默认就是基础系统
if (string.IsNullOrEmpty(systemCode))
{
systemCode = "Base";
}
userInfo.SystemCode = systemCode;
// 判断用户是否在指定的角色里?
BaseUserManager userManager = new BaseUserManager(userInfo);
return userManager.IsInRoleByCode(userId, roleCode);
}
#endregion #region public bool IsAuthorized(string systemCode, string userId, string permissionItemCode)
/// <summary>
/// 对某个模块、操作是否有权限?
/// </summary>
/// <param name="systemCode">子系统编号</param>
/// <param name="userId">用户主键</param>
/// <param name="permissionItemCode">操作权限编号、模块编号</param>
/// <returns>是否拥有操作权限</returns>
[WebMethod]
public bool IsAuthorized(string systemCode, string userId, string permissionItemCode)
{
bool returnValue = false;
// 需要创建个用户对象
DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo();
// 若没指定是哪个子系统,默认就是基础系统
if (string.IsNullOrEmpty(systemCode))
{
systemCode = "Base";
}
userInfo.SystemCode = systemCode;
// 实时从数据库判断权限的调用方法
returnValue = permissionService.IsAuthorizedByUser(userInfo, userId, permissionItemCode, string.Empty);
return returnValue;
}
#endregion #region public bool IsUrlAuthorized(string systemCode, string userId, string url)
/// <summary>
/// 对某个模块、操作是否有权限?
/// </summary>
/// <param name="systemCode">子系统编号</param>
/// <param name="userId">用户主键</param>
/// <param name="url">按网址授权</param>
/// <returns>是否拥有操作权限</returns>
[WebMethod]
public bool IsUrlAuthorized(string systemCode, string userId, string url)
{
bool returnValue = false;
// 需要创建个用户对象
DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo();
// 若没指定是哪个子系统,默认就是基础系统
if (string.IsNullOrEmpty(systemCode))
{
systemCode = "Base";
}
userInfo.SystemCode = systemCode;
// 实时从数据库判断权限的调用方法
returnValue = permissionService.IsUrlAuthorizedByUser(userInfo, userId, url);
return returnValue;
}
#endregion #region public string[] GetUserPermissions(string systemCode, string userId)
/// <summary>
/// 获取用户的所有权限列表
/// </summary>
/// <param name="systemCode">子系统编号</param>
/// <param name="userId">用户主键</param>
/// <returns>权限编号数组</returns>
[WebMethod]
public string[] GetUserPermissions(string systemCode, string userId)
{
List<string> permissions = new List<string>();
// 需要创建个用户对象
DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo();
// 若没指定是哪个子系统,默认就是基础系统
if (string.IsNullOrEmpty(systemCode))
{
systemCode = "Base";
}
userInfo.SystemCode = systemCode;
// 获取用户的所有权限列表
List<BaseModuleEntity> entityList = permissionService.GetModuleListByUser(userInfo, userId);
foreach (var entity in entityList)
{
// 权限编号
// entity.Code;
permissions.Add(entity.Code);
// 能访问的url列表
// entity.NavigateUrl;
// entity.FullName;
}
return permissions.ToArray();
}
#endregion
}
}
A: SSO服务器端配置说明:
1: 附加数据库,把sql2008数据库配置好,附加DotNet.CommonV3.9\DotNet.DataBase\SQL2008\UserCenter39
2: 配置 DotNet.Common\Friend, MVC的单点登录程序,配置数据库连接Web.config中的UserCenterDbConnection的数据库连接。
3: 删除单点登录的SSO,SSOVerify,SSOPermissionService项目,从Web.config中。
进行以上3个步骤,mvc 的 SSO 服务器端就配置好了,在iis里设置好MVC网站就可以了。
B: SSO 客户端的配置说明:
1:添加2个dll的引用,DotNet.Business、 DotNet.Utilities,dll在 DotNet.Common\Friend\External 目录下。
2:Controller 需要加 [NeedAuthorize] 进行单点登录控制, [NeedUrlAuthorized]进行ul 权限限制。
3:Web.config 中加 SSO,SSOVerify,SSOPermissionService 的配置。
4:添加 PermissionWebService 引用,就是需要引用 上面里的单点登录 WebService。
5:Global.asax 中需要写一下 Application_Start() 中的代码复制过去。
02:MVC 数据库连接的配置。
03:MVC 用户名密码登录,有错误时需要有错误提示信息。
04:MVC 里保存密码的方式,Cokies 保存测试。
05:MVC cookies 保存的时间长度设置,是否启用cookies。
06:MVC 若有登录自动跳转地址的方式。
07:MVC 用OpenId(Key)登录的方式,登录跳转的优化。
08:MVC 多系统支持单点登录的配置注意事项。
09:MVC 权限判断的例子。
10:MVC URL 权限判断的例子。
11:MVC 退出功能的深入优化,能退出子系统也可以退出主系统。
C# 单点登录 MVC的更多相关文章
- cas 在.net 下的单点登录实现及 ,Net Mvc的接入
最近在研究单点登录,发现用的最广的就是cas了,查了下资料,发现有人写了详细的说明 地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870 ...
- 单点登录 .NET MVC
原文:单点登录 .NET MVC CAS 实现单点登录 .NET MVC 单点登录 Single Sign On,简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应 ...
- MVC - 单点登录中间件
本章将要和大家分享的是一个单点登录中间件,中间件听起来高深其实这里只是吧单点登录要用到的逻辑和处理流程封装成了几个方法而已,默认支持采用redis服务保存session的方式,也可以使用参数Func& ...
- .NET Core2.0+MVC 用session,cookie实现的sso单点登录
博主刚接触.NET Core2.0,想做一个单点登录的demo,所以参考了一些资料,这里给上链接: 1.http://www.cnblogs.com/baibaomen/p/sso-sequence- ...
- .NET Core2.0+MVC 用Redis/Memory+cookie实现的sso单点登录
之前发布过使用session+cookie实现的单点登录,博主个人用的很不舒服,为什么呢,博主自己测试的时候,通过修改host的方法,在本机发布了三个站点,但是,经过测试,发现,三个站点使用的sess ...
- 实战:ADFS3.0单点登录系列-集成MVC
本文将讲解如何让MVC应用程序与ADFS集成,完成认证的过程. 目录: 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:ADFS3.0单点登录系列-ADFS3 ...
- MVC - 单点登录中间件 (转)
http://www.cnblogs.com/wangrudong003/p/6435013.html 本章将要和大家分享的是一个单点登录中间件,中间件听起来高深其实这里只是吧单点登录要用到的逻辑和处 ...
- asp.net mvc 权限过滤和单点登录(禁止重复登录)
1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下 /// <summary> /// 用户权限控制 /// < ...
- CAS 实现单点登录 .NET MVC
单点登录 Single Sign On,简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 单点登录原理 ...
随机推荐
- android 回调函数一:基本概念
1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C ...
- 【转】handler.removeCallbacks失效问题
package com.example.demoactivity; import android.app.Activity; import android.os.Bundle; import andr ...
- java多线程系列5-死锁与线程间通信
这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两 ...
- iOS支付宝集成详细流程
实现支付宝支付的准备工作: 1.向支付宝签约,成为支付宝的商户 签约完成后,支付宝会提供一些必要的数据给我们 商户ID:partner 账号ID:seller 即支付宝账号 签约需要营业执照 2.获取 ...
- Swift学习--常量.变量.数据类型的使用(一)
一.Swift中的常量和变量 /* Swift 中定义常量和变量用let/var let 代表定义一个常量 var 代表定义一个变量 Swift 中代表定义常量和变量不需要写数据类型,编译器辉根据我们 ...
- 关于Redis的启动过程
一.简介 Redis的启动也就是main函数的执行,程序的入口在redis.c中,启动流程: 1. 初始化默认服务器配置,如果是sentinel模式还需进行额外的配置 2. 修改配置文件或配置选项,这 ...
- SQL基础(1)-创建及修改表
1. 建表语句 CREATE TABLE fdh_client_info ( id varchar2(50) primary key, name varchar2(30) not null, sex ...
- 问题解决——WSAAsyncSelect模型 不触发 FD_CLOSE
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 详解xml文件描述,读取方法以及将对象存放到xml文档中,并按照指定的特征寻找的方案
主要的几个功能: 1.完成多条Emp信息的XML描述2.读取XML文档解析Emp信息3.将Emp(存放在List中)对象转换为XML文档4.在XML文档中查找指定特征的Emp信息 dom4j,jaxe ...
- td内元素居顶,td元素不随高度的撑开而变位置
如下图,右边内容变高了,左边元素位置就下降到居中 设置居顶不变的方法 <table width="200" border="1"> <tr&g ...