0
点赞
收藏
分享

微信扫一扫

Lind.DDD.Authorization用户授权介绍

​​回到目录​​

Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统来说都是必要的,像管理型的页面都需要用户先去登陆,然后拿到凭证,才可以进行访问,这在MVC和WebApi体系结构里是很容易实现的,像过滤器里的AuthorizeAttribute和ActionFilterAttribute都可以实现用户授权的功能。

AuthorizeAttribute和ActionFilterAttribute

AuthorizeAttribute这个过滤器从字面上就可以看出它的功能,它主要用在用户角色授权上,对于我们的系统来说,那就是哪些页面需要登陆,就把哪个Action添加这个特性,它有方法OnAuthorization,表示当页面加载之前,去判断用户是否有访问本action的权限,我们可以根据自己的需要去override它;ActionFilterAttribute过滤器是我们平时用的最多的,即在action执行前,后,View渲染前,渲染后的跟踪,我们在使用时,重写对应的方法,即可以实现对各个步骤的跟踪。

Lind.DDD.Authorization用户授权介绍_持久化

Lind.DDD.Authorization用户授权介绍_持久化_02

实现原理,方法拦截

在mvc里,过滤器的含义就是方法拦截,这个概念和Aop不某而合,都是对方法进行拦截,然后进行二次加工,过滤器的原理也一样,在进行拦截后,可以去填充你自己的业务逻辑,然后选择继续渲染还是离开页面。

AuthorizationLoginFilter过滤器的实现

下面是我自己整理的,用户授权的一个过滤器,分享一下

/// <summary>
/// 授权过滤器
/// Function:MVC模式下使用
/// Author:Lind.zhang
/// </summary>
public class AuthorizationLoginFilter : AuthorizeAttribute
{

/// <summary>
/// 验证失败后所指向的控制器和action
/// 可以在使用特性时为它进行赋值
/// </summary>
public AuthorizationLoginFilter(string failControllerName = "Home", string failActionName = "Login")
{
_failControllerName = failControllerName;
_failActionName = failActionName;
}
public string _failControllerName, _failActionName;
public override void OnAuthorization(AuthorizationContext filterContext)
{
//被添加AllowAnonymousAttribute特性的过滤器将不参加AuthorizationLoginFilter的验证
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

//为登陆页添加例外,其它页都自动在global.asax里添加到全局过滤器中,MVC3及以后版本支持它
if (!skipAuthorization)
{
if (!CurrentUser.IsLogin)
{
filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary {
{ "Action",_failActionName },
{ "Controller", _failControllerName},
{ "returnUrl", HttpContext.Current.Request.Url.ToString() } });
}
}
}
}

授权模块的CurrentUser的实现

对于过滤器把没有登陆的用户指引登陆页后,用户将进行登陆操作,然后Lind.DDD要做什么?需要将用户标示,角色信息,权限信息进行存储,这时就是我们CurrentUser登场的时候了,设计很简单,一个方法用来持久化用户授权的对象,几个属性用来返回需要返回的内容,呵呵 !

/// <summary>
/// 当前登陆的用户信息
/// 可以有Redis Session和Session进行实现
/// </summary>
public class CurrentUser
{
#region Public Properties
/// <summary>
/// 当然登陆的用户ID
/// </summary>
public static string UserID
{
get
{
return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 当前登陆的用户名
/// </summary>
public static string UserName
{
get
{
return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 用户角色
/// </summary>
public static string Role
{
get
{
return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 用户权限
/// 增,删,改,查
/// </summary>
public static string Authority
{
get
{
return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 当前登陆用户存储的扩展信息
/// </summary>
public static string ExtInfo
{
get
{
return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 是否登陆
/// </summary>
public static bool IsLogin
{
get
{
return !string.IsNullOrWhiteSpace(UserID);
}
}
#endregion

#region Public Methods
/// <summary>
/// 退出登陆
/// </summary>
public static void Exit()
{
System.Web.HttpContext.Current.Session.Abandon();//清除全部Session
}
/// <summary>
/// 将用户信息持久化到Session
/// </summary>
/// <param name="userID"></param>
/// <param name="userName"></param>
/// <param name="ExtInfo"></param>
public static void Serialize(
string userID,
string userName,
string extInfo = "",
string role = "",
string authority = "")
{
System.Web.HttpContext.Current.Session["UserID"] = userID;
System.Web.HttpContext.Current.Session["UserName"] = userName;
System.Web.HttpContext.Current.Session["ExtInfo"] = ExtInfo;
System.Web.HttpContext.Current.Session["Role"] = role;
System.Web.HttpContext.Current.Session["Authority"] = authority;

}
#endregion

}

OK,对于Lind.DDD.Authorization用户授权这块就说到这里,如果对大家有帮助,请您点个赞吧!

​​回到目录​​

 

作者:仓储大叔,张占岭,
荣誉:微软MVP



举报

相关推荐

0 条评论