Пользовательский атрибут авторизации
Я создаю свою собственную систему членства, и я не хочу иметь ничего общего с поставщиком членства 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);
}
Сообщите мне, если я правильно понял, пожалуйста...
Ответы
Ответ 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;
}