自定义授权属性

时间:2011-02-21 19:30:47

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership

我正在建立自己的会员系统,我想要与MS会员提供商无关。我已经浏览了互联网和StackOverflow,但我所能找到的只是建立在MS会员提供商之上的会员提供商。

无论如何,我现在几乎所有东西都搞定了,但是我想使用一个自定义的Authorize属性来利用我的会员基础设施。我在网站上检查了this线程,我正在尝试做类似的事情,但我不确定我需要的是什么。到目前为止,这些是我得到的课程:

SessionManager:

public static class SessionManager : ISessionManager
{
    public static void RegisterSession(string key, object obj)
    {
        System.Web.HttpContext.Current.Session[key] = obj;
    }

    public static void FreeSession(string key)
    {
        System.Web.HttpContext.Current.Session[key] = null;
    }


    public static bool CheckSession(string key)
    {
        if (System.Web.HttpContext.Current.Session[key] != null)
            return true;
        else
            return false;
    }


    public static object ReturnSessionObject(string key)
    {
        if (CheckSession(key))
            return System.Web.HttpContext.Current.Session[key];
        else
            return null;
    }
}

SharweAuthorizeAttribute:我不确定这是不是我应该做的

public class SharweAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true)
            return true;
        else 
            return false;
    }
}

现在我需要的是:

  1. 是我的SharweAuthorizeAttribute类 首先是正确的吗?
  2. 我需要能够重定向 未经身份验证的用户登录 页
  3. 我需要根据用户授权 他们的角色(使用我自己的角色 提供者)所以我会做点什么 像:

    [SharweAuthorize(Roles="MyRole")]
    
  4. 这就是我猜...任何建议都非常受欢迎:)

    更新 好的,我只是再次阅读该页面,找到了第二个问题的解决方案:

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == false)
        {
            filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary 
                            {
                                { "action", "ActionName" },
                                { "controller", "ControllerName" }
                            });
        }
        else
            base.HandleUnauthorizedRequest(filterContext);
    }
    

    请告诉我,如果我做对了,请...

1 个答案:

答案 0 :(得分:21)

是的,你做得对(IMO实现自定义会员提供商更安全,更简单,但这是你的选择)

  1. 是的,这是正确的
  2. 你做对了
  3. 您从roles基类继承AuthorizeAttribute属性,如果用户在角色中,则检查您的实现。
  4. 编辑:更多关于角色的事情

    如果你有

    [SharweAuthorize(Roles="MyRole")]
    

    然后您可以检查AuthorizeCore方法中的Roles属性

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true) {
            if (SessionManager.CheckUserIsInRole( Roles )) // where Roles == "MyRole"
               return true;
        }
        return false;
    }