Asp.net mvc 權(quán)限過(guò)濾和單點(diǎn)登錄(禁止重復(fù)登錄)
1.權(quán)限控制使用controller和 action來(lái)實(shí)現(xiàn),權(quán)限方式有很多種,最近開(kāi)發(fā)項(xiàng)目使用控制控制器方式實(shí)現(xiàn)代碼如下
/// <summary>
/// 用戶權(quán)限控制
/// </summary>
public class UserAuthorize : AuthorizeAttribute
{
/// <summary>
/// 授權(quán)失敗時(shí)呈現(xiàn)的視圖
/// </summary>
public string AuthorizationFailView { get; set; }
/// <summary>
/// 請(qǐng)求授權(quán)時(shí)執(zhí)行
/// </summary>
/// <param name="filterContext">上下文</param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
// 獲取url請(qǐng)求里的 controller 和 action
string controllerName = filterContext.RouteData.Values["controller"].ToString();
string actionName = filterContext.RouteData.Values["action"].ToString();
// 獲取用戶信息
UserLoginBaseInfo _userLoginInfo = filterContext.HttpContext.Session[Property.UerLoginSession] as UserLoginBaseInfo;
//根據(jù)請(qǐng)求過(guò)來(lái)的controller和action去查詢可以被哪些角色操作: 這是查詢數(shù)據(jù)庫(kù) roleid使用 1,2,3,4格式
RoleWithControllerAction roleWithControllerAction =
SampleData.roleWithControllerAndAction.FirstOrDefault(r => r.ControllerName.ToLower() == controllerName.ToLower() && r.ActionName.ToLower() == actionName.ToLower() && r.RoleIds.contails("3"));
// 有值處理
if (roleWithControllerAction != null)
{
//有權(quán)限操作當(dāng)前控制器和Action的角色id
this.Roles = roleWithControllerAction.RoleIds;
}
else
{
//請(qǐng)求失敗輸出空結(jié)果
filterContext.Result = new EmptyResult();
//打出提示文字
HttpContext.Current.Response.Write("對(duì)不起,你沒(méi)有權(quán)限操作!");
}
base.OnAuthorization(filterContext);
}
/// <summary>
/// 自定義授權(quán)檢查(返回False則授權(quán)失敗)
/// </summary>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//if (httpContext.User.Identity.IsAuthenticated)
//{
// string userName = httpContext.User.Identity.Name; //當(dāng)前登錄用戶的用戶名
// User user = SampleData.users.Find(u => u.UserName == userName); //當(dāng)前登錄用戶對(duì)象
// if (user != null)
// {
// Role role = SampleData.roles.Find(r => r.Id == user.RoleId); //當(dāng)前登錄用戶的角色
// foreach (string roleid in Roles.Split(','))
// {
// if (role.Id.ToString() == roleid)
// return true;
// }
// return false;
// }
// else
// return false;
//}
//else
// return false; //進(jìn)入HandleUnauthorizedRequest
return true;
}
/// <summary>
/// 處理授權(quán)失敗的HTTP請(qǐng)求
/// </summary>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (string.IsNullOrWhiteSpace(AuthorizationFailView))
AuthorizationFailView = "error";
filterContext.Result = new ViewResult { ViewName = AuthorizationFailView };
}
}
二.單點(diǎn)登錄方式使用application方式來(lái)實(shí)現(xiàn)
1.用戶登錄成功后記錄當(dāng)前信息
/// <summary>
/// 限制一個(gè)用戶只能登陸一次
/// </summary>
/// <returns></returns>
private void GetOnline()
{
string UserID = "1";
Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application[Property.Online];
if (SingleOnline == null)
SingleOnline = new Hashtable();
IDictionaryEnumerator idE = SingleOnline.GetEnumerator();
string strKey = string.Empty;
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(UserID))
{
//already login
strKey = idE.Key.ToString();
//當(dāng)前用戶已存在移除、
SingleOnline.Remove(strKey);
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[Property.Online] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
break;
}
}
//SessionID
if (!SingleOnline.ContainsKey(Session.SessionID))
{
SingleOnline[Session.SessionID] = UserID;
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[Property.Online] = SingleOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
}
2.使用ActionFilter來(lái)實(shí)現(xiàn)單點(diǎn)登錄,每次點(diǎn)擊控制器都去查詢過(guò)濾是否在其它地方登錄
/// <summary>
/// 用戶基礎(chǔ)信息過(guò)濾器
/// </summary>
public class LoginActionFilter : ActionFilterAttribute
{
/// <summary>
/// 初始化地址
/// </summary>
public const string Url = "~/Login/Index?error=";
/// <summary>
/// 該方法會(huì)在action方法執(zhí)行之前調(diào)用
/// </summary>
/// <param name="filterContext">上下文</param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// 獲取上一級(jí)url
// var url1 = filterContext.HttpContext.Request.UrlReferrer;
UserLoginBaseInfo _userLogin = filterContext.HttpContext.Session[Property.UerLoginSession] as UserLoginBaseInfo;
// 用戶是否登陸
if (_userLogin == null)
{
filterContext.Result = new RedirectResult(Url + "登陸時(shí)間過(guò)期,請(qǐng)重新登陸!&url=" + filterContext.HttpContext.Request.RawUrl);
}
else
{
filterContext.HttpContext.Session.Timeout = 30;
}
//判斷是否在其它地方登錄
Hashtable singleOnline = (Hashtable)System.Web.HttpContext.Current.Application[Property.Online];
// 判斷當(dāng)前SessionID是否存在
if (singleOnline != null && !singleOnline.ContainsKey(HttpContext.Current.Session.SessionID))
filterContext.Result = new RedirectResult(Url + "你的帳號(hào)已在別處登陸,你被強(qiáng)迫下線!");
base.OnActionExecuting(filterContext);
}
/// <summary>
/// 執(zhí)行后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//記錄操作日志,寫(xiě)進(jìn)操作日志中
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
base.OnResultExecuting(filterContext);
}
3.用戶正常退出或則非正常退出處理當(dāng)前用戶信息銷毀Session
/// <summary>
/// Session銷毀
/// </summary>
protected void Session_End()
{
Hashtable SingleOnline = (Hashtable)Application[Property.Online];
if (SingleOnline != null && SingleOnline[Session.SessionID] != null)
{
SingleOnline.Remove(Session.SessionID);
Application.Lock();
Application[Property.Online] = SingleOnline;
Application.UnLock();
}
Session.Abandon();
}
以上所述是小編給大家介紹的Asp.net mvc 權(quán)限過(guò)濾和單點(diǎn)登錄(禁止重復(fù)登錄),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
.NET?6開(kāi)發(fā)TodoList應(yīng)用引入第三方日志庫(kù)
這篇文章主要介紹了.NET?6開(kāi)發(fā)TodoList應(yīng)用引入第三方日志庫(kù),在我們項(xiàng)目開(kāi)發(fā)的過(guò)程中,使用.NET?6自帶的日志系統(tǒng)有時(shí)是不能滿足實(shí)際需求的,比如有的時(shí)候我們需要將日志輸出到第三方平臺(tái),更多詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2021-12-12
ASP.NET Core如何添加統(tǒng)一模型驗(yàn)證處理機(jī)制詳解
這篇文章主要給大家介紹了關(guān)于ASP.NET Core如何添加統(tǒng)一模型驗(yàn)證處理機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05
.net Core連接MongoDB數(shù)據(jù)庫(kù)的步驟詳解
這篇文章主要給大家介紹了關(guān)于.net Core連接MongoDB數(shù)據(jù)庫(kù)步驟的相關(guān)資料,文中將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫(xiě)入,獲取文件夾大小,文件屬性,遍歷目錄)
Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫(xiě)入,獲取文件夾大小,文件屬性,遍歷目錄),需要的朋友可以參考下2008-07-07
asp.net基于Web Service實(shí)現(xiàn)遠(yuǎn)程上傳圖片的方法
這篇文章主要介紹了asp.net基于Web Service實(shí)現(xiàn)遠(yuǎn)程上傳圖片的方法,涉及asp.net調(diào)用Web Service的文件流操作與文件傳輸實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
GridView控件實(shí)現(xiàn)數(shù)據(jù)的修改(第9節(jié))
這篇文章主要介紹了GridView控件實(shí)現(xiàn)數(shù)據(jù)的修改,需要的朋友可以參考下2015-08-08
asp.net core集成CKEditor實(shí)現(xiàn)圖片上傳功能的示例代碼
這篇文章主要介紹了asp.net core集成CKEditor實(shí)現(xiàn)圖片上傳功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

