Подтвердить что ты не робот

Пользовательский атрибут авторизации

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

Во всяком случае, сейчас у меня почти все, но я хотел бы использовать специальный атрибут 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;
    }
}

Теперь вот что мне нужно:

  • Является ли мой класс SharweAuthorizeAttribute правильно ли в первую очередь?
  • Мне нужно перенаправить неавторизованные пользователи для входа в систему страница
  • Мне нужно авторизовать пользователей на основе их роли (используя мою собственную роль провайдер), поэтому я бы сделал что-то как:

    [SharweAuthorize(Roles="MyRole")]
    

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

UPDATE: Хорошо, я только что прочитал эту страницу и нашел решение вопроса номер два:

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);
}

Сообщите мне, если я правильно понял, пожалуйста...

4b9b3361

Ответ 1

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

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

Изменить: немного больше о ролях.

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

[SharweAuthorize(Roles="MyRole")]

то вы можете проверить свойство Роли в методе AuthorizeCore

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