如何使用其他数据库和会话进行授权?

时间:2012-03-04 15:09:11

标签: asp.net-mvc

我正在构建一个Asp.net MVC3应用程序(使用Razor),我有一个数据库,其中包含有关用户和角色的信息。

这是我的数据库的简化方案。

用户( IDUser ,登录,密码);
角色( IDRole ,姓名);
UserInRole( IDUser IDRole ); //多对多

看起来像这样:

db schema screnshot

我读到了使用AuthorizeAttribute,控制loged用户的页面,以及使用特定角色和我研究使用My DB来控制用户和角色。所以我的问题是:

  1. 是否可以使用我的数据库来管理用户和角色,并在我的操作中使用[授权]? [如果我是这样做的?]
  2. 是否可以使用会话代替cookie来管理登录并使用授权本机Asp.net MVC3? [如果是的话,我是怎么做到的?如果没有如何使用会话,否则?]
  3. 如果可能,请发布代码示例。

2 个答案:

答案 0 :(得分:1)

不确定我是否理解正确,但您想使用[Authorize]属性来处理自定义用户数据库吗?

如果是这种情况,可以检查一下:

要简单地允许/拒绝用户是否获得授权,库存[Authorize]属性将正常运行。自定义逻辑进入您的登录操作,您将使用给定的凭据检查数据库并相应地发出cookie。类似的东西:

    public ActionResult Login(string username, string password)
    {
        bool isValid = //check the database with the given username and password

        if(isValid)
        {
            FormsAuthentication.SetAuthCookie(username, false);

            return RedirectToAction("...");
        }else
        {
            return View();
        }
    }

如果您还希望根据角色控制访问权限,我会说有两种直接方式:

  • 实现自定义成员资格和角色提供程序,这是我不喜欢的东西,因为我觉得它们很无用,并且总是最终重做我的资源库中的逻辑

  • 实施自定义AuthorizeAttribute,例如

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            //Check based on these 2 properties:
            //  this.Roles
            //  this.Users
            //against httpContext.User
    
            //return true or false to indicate access or deny 
        }
    }
    

答案 1 :(得分:0)

感谢佩德罗。根据你的帖子我构建它以使用SESSION:

public class CustomAutorizeAttribute : AuthorizeAttribute
{
    public List<string> Roles { get; set; }

    public CustomAutorizeAttribute()
    {
    }

    public CustomAutorizeAttribute(params string[] Roles)
    {
        this.Roles = new List<string>();
        this.Roles.AddRange(Roles);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        User user = (User)httpContext.Session["user"];

        if (user != null)
        {
            if (Roles != null)
            {
                foreach (var role in user.Roles)
                {
                    if (Roles.Exists(e => e == role)) return true;
                }
                return false; // User don't have any hole
            }
            else
            {
                return true; // The Attribute is used without roles.
            }
        }
        else return false; // Not logged.
    }
}

在这里发帖,希望别人。