Пользовательский атрибут авторизации - PullRequest
40 голосов
/ 21 февраля 2011

Я создаю свою собственную систему членства и не хочу иметь ничего общего с поставщиком MS Membership.Я просматривал Интернет и здесь, на StackOverflow, но все, что я мог найти, это провайдеры членства, построенные поверх провайдера MS Membership.

В любом случае, у меня сейчас почти все подключено, но я быхотел бы использовать собственный атрибут Authorize, который использовал мою инфраструктуру членства.Я проверил эту ветку здесь на сайте, и я пытаюсь сделать что-то подобное, но я не уверен, что это тихо, что мне нужно.Пока это классы, которые у меня есть:

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")]
    

Вот и я ... Любые предложения приветствуются:)

ОБНОВЛЕНИЕ: Хорошо, я просто снова прочитал эту страницу инашел решение вопроса номер два:

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 Ответ

21 голосов
/ 22 февраля 2011

Да, вы правильно поняли (IMO, безопаснее и проще внедрить пользовательского поставщика членства, но это ваш выбор)

  1. Да, это правильно
  2. Вы делаете это правильно
  3. Вы наследуете свойство roles от базового класса AuthorizeAttribute и проверяете в своей реализации, есть ли пользователь в роли.

Редактировать: немного больше о роли ролей

если у вас есть

[SharweAuthorize(Roles="MyRole")]

тогда вы можете проверить свойство Roles в методе AuthorizeCore

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