您的位置:首页 > 其它

基于通用权限管理系统实现的单点登录

2014-03-11 22:30 639 查看
在一个项目中,需要使用单点登录,下面是我在结合通用权限管理系统做的一个登录程序,注意登录后本地服务器程序中没有使用session保存登录信息,使用的是FormsAuthentication。

登陆页主要代码

using DotNet.Business;
using DotNet.Utilities;
using Newtonsoft.Json;
using ZTOTransferFees.Foundation;
using ZTOTransferFees.WebSite.WebPermission;
/// <summary>
/// 登录页面
///
/// <author>
///     <name>SongBiao</name>
///     <date>2014.03.09</date>
/// </author>
/// </summary>
public partial class Login : BasePage
{
/// <summary>
///
/// </summary>
protected string act = string.Empty;
/// <summary>
/// 站点
/// </summary>
protected string sitename = string.Empty;
/// <summary>
/// 用户名
/// </summary>
protected string username = string.Empty;
/// <summary>
///  密码
/// </summary>
protected string password = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
act = string.IsNullOrWhiteSpace(Request["act"]) || string.Equals(Request["act"], "null", StringComparison.OrdinalIgnoreCase) ? "" : Request["act"].Trim();
if (!string.IsNullOrWhiteSpace(act) && string.Equals("login", Request["act"].Trim(), StringComparison.OrdinalIgnoreCase))
{
Response.ContentType = "application/json";
sitename = string.IsNullOrWhiteSpace(Request["sitename"]) || string.Equals(Request["sitename"], "null", StringComparison.OrdinalIgnoreCase) ? "" : Request["sitename"].Trim();
username = string.IsNullOrWhiteSpace(Request["username"]) || string.Equals(Request["username"], "null", StringComparison.OrdinalIgnoreCase) ? "" : Request["username"].Trim();
password = string.IsNullOrWhiteSpace(Request["password"]) || string.Equals(Request["password"], "null", StringComparison.OrdinalIgnoreCase) ? "" : Request["password"].Trim();
LoginResult loginResult = new LoginResult();
BaseUserInfo userInfo = null;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
if (!string.IsNullOrWhiteSpace(sitename) && !string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(password))
{
//webservice 方式访问
PermissionServiceSoapClient webPermission = new PermissionServiceSoapClient();
string jsonData = webPermission.LogOnByCompany(sitename, username, password);
dynamic json = JsonConvert.DeserializeObject(jsonData);
string statusCode=string.Empty;
string statusMessage = string.Empty;
string userData = string.Empty;
statusCode = (string)((dynamic)json)["StatusCode"];
statusMessage = (string)((dynamic)json)["StatusMessage"];
if (string.Equals("OK", statusCode, StringComparison.OrdinalIgnoreCase))
{
userData = json["UserInfo"].ToString();
userInfo = javaScriptSerializer.Deserialize<BaseUserInfo>(userData);
FormsAuthentication.SetAuthCookie(userInfo.UserName, true, FormsAuthentication.FormsCookiePath);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userInfo.UserName, DateTime.Now, DateTime.Now.AddMinutes(20), false, userData);
FormsIdentity identity = new FormsIdentity(authTicket);
ManageCookies.AddCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
loginResult.Status = statusCode;
loginResult.Message = statusMessage;
}
}
string  result= javaScriptSerializer.Serialize(loginResult);
Response.Write(result);
Response.End();
}

}
/// <summary>
/// 登录结果
/// </summary>
class LoginResult
{
public string Status
{
set;
get;
}
public string Message
{
set;
get;
}
}
}


登录验证基类页主要代码

using System.Web.Script.Serialization;
using DotNet.Utilities;
/// <summary>
/// 权限基类页
///   1、单点登录信息 登陆后保存用户信息  FormsAuthenticationTicket
///   2、所有需要登录或炎症权限的均集成此类
///
///
/// <author>
///     <name>SongBiao</name>
///     <date>2014.03.09</date>
/// </author>
/// </summary>
public class AuthBasePage : BasePage
{
protected BaseUserInfo userInfo = new BaseUserInfo();
protected string userData = string.Empty;
protected override void OnInit(EventArgs e)
{
//判断是否得到身份认证
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
Response.Redirect(FormsAuthentication.LoginUrl);
}
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
userData = authTicket.UserData;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
userInfo=javaScriptSerializer.Deserialize<BaseUserInfo>(userData);
          base.OnInit(e);

}
}


安全退出主要实现代码:需要实现本地退出时,主站也一起退出

public partial class Logout : AuthBasePage
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
//本地站点先退出 这样在主站退出有异常时可保证本地安全退出
FormsAuthentication.SignOut();
//ManageCookies.RemoveCookie(FormsAuthentication.FormsCookieName);
ManageCookies.SetCookie(FormsAuthentication.FormsCookieName, DateTime.Now.AddDays(-1));
//主站退出
DotNet.Business.Utilities.Logout(userInfo, false);
}
catch (Exception ex)
{
LogHelper.WriteErrorLog("安全退出Logout出现异常", ex);
}
finally
{
//返回到登录页面
Response.Redirect(FormsAuthentication.LoginUrl);
}
}
}


注意 在Global.aspx中需要设置配置

protected void Application_Start(object sender, EventArgs e)
{
// 读取配置文件
BaseConfiguration.GetSetting();
}


上面using DotNet.Business;using DotNet.Utilities;是引用吉日嘎拉先生通用权限管理系统的组件。
这里还没涉及到权限管理这一块,如何进行登录后的权限控制下次再分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐