.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。

.NET 实现自定义ContextUser的Identity和Principal 

在传统的.NET中,我们可以通过

 

        User.Identity.Name;//获取用户名

        User.Identity.IsAuthenticated;//判断用户是否己验证

        User.IsInRole("Admin");//判断用户是否含有指定角色


 

但这样的机制,在实际开发中,难以满足开发需要.仅仅通过User.Identity.Name;获取用户名,和User.Identity.IsAuthenticated;判断用户是否验证,是难以满足需要。如何获取用户更多信息,或者进行更详细的权限判断。

 

我们可以通过自定义Identity和Principal进行实现!

 

    /// <summary>

    /// 自定义当前用户标识对象

    /// </summary>

    public class MyIdentity:IIdentity

    {

 

        #region 用户属性(可自定义更多信息)

        private string _userName;//用户账号

        private string _departmnet;//用户所在部门

        private string _phone;//用户联系电话

        #endregion

 

        /// <summary>

        /// 用户账号

        /// </summary>

        public string UserName

        {

            get { return _userName; }

        }

        /// <summary>

        /// 用户所在部门

        /// </summary>

        public string Departmnet

        {

            get { return _departmnet; }

        }

        /// <summary>

        /// 用户电话

        /// </summary>

        public string Phone

        {

            get { return _phone; }

        }

        /// <summary>

        /// 构造函数,根据用户名

        /// </summary>

        /// <param name="UserName"></param>

        public MyIdentity(string UserName)

        {

            //根据UserName查询数据库获得以下数据

            this._userName = "abc";

            this._departmnet = "行政部";

            this._phone = "123456";

        }

        /// <summary>

        /// 构造函数,根据用户ID

        /// </summary>

        /// <param name="UserID"></param>

        public MyIdentity(int UserID)

        {

            //根据UserName查询数据库获得以下数据

            this._userName = "abc";

            this._departmnet = "行政部";

            this._phone = "123456";

        }

        #region 基本属性

        /// <summary>

        /// 返回验证方式

        /// </summary>

        public string AuthenticationType

        {

            get { return "Form"; }

        }

        /// <summary>

        /// 是否验证

        /// </summary>

        public bool IsAuthenticated

        {

            get { return true; }

        }

        /// <summary>

        /// 返回用户

        /// </summary>

        public string Name

        {

            get { return _userName; }

        }

        #endregion

    }


 

    /// <summary>

    /// 当前用户安全上下文信息

    /// </summary>

    public class MyPrincipal:IPrincipal

    {

        #region 属性

        private IIdentity _identity;//用户标识

        private ArrayList _permissionList;//权限列表

        #endregion

 

        /// <summary>

        /// 返回用户权限列表

        /// </summary>

        public ArrayList PermissionList

        {

            get { return _permissionList; }

        }

 

        /// <summary>

        /// 获取当前用户标识

        /// </summary>

        public IIdentity Identity

        {

            get { return _identity; }

        }

        /// <summary>

        /// 当前用户是否指定角色(采用权限值方式,此处返回false)

        /// </summary>

        /// <param name="role"></param>

        /// <returns></returns>

        public bool IsInRole(string role)

        {

            return false;//返回false

        }

        /// <summary>

        /// 构造函数,用户名构造

        /// </summary>

        /// <param name="UserName"></param>

        public MyPrincipal(string UserName)

        {

            _identity = new MyIdentity(UserName);

            //以下权限根据UserName获取数据库用户拥有的权限值,此次省略

            _permissionList = new ArrayList();

            _permissionList.Add(1);

            _permissionList.Add(2);

            _permissionList.Add(3);

            _permissionList.Add(4);

            _permissionList.Add(5);

        }

        /// <summary>

        /// 构造函数,用户ID构造

        /// </summary>

        /// <param name="UserID"></param>

        public MyPrincipal(int UserID)

        {

            _identity = new MyIdentity(UserID);

            //以下权限根据UserName获取数据库用户拥有的权限值,此次省略

            _permissionList = new ArrayList();

            _permissionList.Add(1);

            _permissionList.Add(2);

            _permissionList.Add(3);

            _permissionList.Add(4);

            _permissionList.Add(5);

        }

        /// <summary>

        /// 判断用户是否拥有某权限

        /// </summary>

        /// <param name="permissionid"></param>

        /// <returns></returns>

        public bool IsPermissionID(int permissionid)

        {

            return _permissionList.Contains(permissionid);

        }

    }


 

好,上面我们己实现了自定义,Identity和Principal。

 

我们可以在页面这样使用Identity。

 

//页面中输出自定义用户信息

<%=(User.Identity as ContextUser.MyIdentity).Name %>//用户账号

<%=(User.Identity as ContextUser.MyIdentity).Phone %>//用户电话

<%=(User.Identity as ContextUser.MyIdentity).Departmnet %>//用户所在部门


 

自定义显示用户信息后,我们接着利用Principal进行权限验证和控制

 

在Asp.net Web模式下,使用方式:

 

首先,我们先做一个权限验证基类!

/// <summary>

///权限验证基类

/// </summary>

public class BasePaper:System.Web.UI.Page

{

    public BasePaper()

       {

              //

              //TODO: 在此处添加构造函数逻辑

              //

       }

    protected override void OnInit(EventArgs e)

    {

        BasePage_Load();

    }

    /// <summary>

    /// 设置权限,默认值为0

    /// </summary>

    public virtual int PermissionID

    {

        get { return 0; }

    }

    /// <summary>

    /// 验证方法

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void BasePage_Load()

    {

        //权限检查

        #region 权限检查

        bool Permission = true;//初始值为没有权限

 

                //这一步很重要,要代替.NET的自身的User.

                ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name);

                HttpContext.Current.User = MyPrincipal;

        if ((User as account.ContextUser.MyPrincipal).PermissionList.Contains(PermissionID))

        {

            Permission = false;//验证通过

        }

        if (Permission)//权限验证不通过

        {

            Response.Clear();

            Response.Write("<script language=\"javascript\">alert(\"对不起,你没有权限进入\");history.go(-1);</script>");

            Response.End();

        }

        #endregion

    }

}


 

OK,到了验证页的时候了。

 

public partial class ascx_Add :BasePage

{

    public override int PermissionID

    {

        get

        {

            return 13;//返回要验证权限值

        }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        //

    }

}


 

事实上,在Asp.net MVC模式,更容易对权限进行控制,可以进行更多的细化,对每个动作进行控制。

 

MVC模式下:

 

首先,先实现一个权限验证基类:

 

    /// <summary>

    /// 权限验证基类

    /// 2011.7.3

    /// </summary>

    public class BasePage : AuthorizeAttribute

    {

        /// <summary>

        /// 权限值

        /// </summary>

        private int _permissionID = 0;

        /// <summary

        /// 权限值

        /// </summary>

        public int PermissionID

        {

            get { return _permissionID; }

            set { _permissionID = value; }

        }

        /// <summary>

        /// 在过程请求授权时调用。 

        /// </summary>

        /// <param name="filterContext">对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。</param>

        public override void OnAuthorization(AuthorizationContext filterContext)

        {

            if (HttpContext.Current.User.Identity.IsAuthenticated)

            {

                //这一步很重要,要代替.NET的自身的User.

                ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name);

                HttpContext.Current.User = MyPrincipal;

 

                if ((!MyPrincipal.ISPermissionID(_permissionID)) && (_permissionID != 0))

                {

                    HttpContext.Current.Response.Clear();

                    HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!');history.back();</script>");

                    HttpContext.Current.Response.End();

                    filterContext.Result = new EmptyResult();

                }

            }

            else

            {

                FormsAuthentication.SignOut();

                HttpContext.Current.Response.Clear();

                HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!或当前登录用户已过期!\\n请重新登录或与管理员联系!');</script>");

                HttpContext.Current.Response.End();

                filterContext.Result = new EmptyResult();

            }

        }

 

    }


 

 

回到控制器,进行权限验证

        [BasePage(PermissionID = 13)]//返回要验证权限值

        public ActionResult Index()

        {

           //

        }


 

 

无论对Asp.net Form或者Aap.net MVC,都在一个按钮级的权限控制,

那对于,按钮级的权限如何进行控制昵?

 

看下面代码

 

    //控制删除按扭的显示

    <% if((User as account.ContextUser.MyPrincipal).PermissionList.Contains(13) {%>

    <input type="submit" name="button" id="button" value="删除" />

    <%} %>


 

 

至此,如何实现自定义Identity和Principal,进行整合更多用户信息,和权限验证。己经介绍完了。

 

更多问题,请大家加入.NET技术群进行讨论.群号是:160046333,欢迎加入。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值