Хорошо, продолжаем с этой темой , вот что я придумал ...
public class SharweAuthorizeAttribute : AuthorizeAttribute
{
private bool isAuthenticated = false;
private bool isAuthorized = false;
public new string[] Roles { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (SessionManager.CheckSession(SessionKeys.User) == true)
{
isAuthenticated = true;
foreach (string role in Roles)
{
if (RolesService.HasRole((string)role))
isAuthorized = true;
}
}
return (isAuthenticated && isAuthorized);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!isAuthenticated)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "User" },
{ "controller", "Login" }
});
} else if(!isAuthorized) {
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "Home" },
{ "controller", "Error" }
});
}
}
}
Как / почему я это придумал? Потому что я считаю, что рабочий процесс AuthorizeAttribute выглядит следующим образом:
- Во-первых, AuthorizeCore срабатывает. Если он возвращает true, пользователь авторизован. Если он возвращает false, запускается HandleUnauthorizedRequest. Это верно?
- Я где-то читал, что мне нужно использовать ключевое слово
new
для переопределения свойства. Таким образом, я переопределил свойство Roles. Но что, если переопределяющее свойство было другого типа, чем исходное свойство (свойство базового класса), это также скрывает его или создает совершенно другое свойство?
Так что ты думаешь? Должно ли это на самом деле работать? Я не могу проверить это сейчас, потому что я не настроил пользовательский интерфейс (ожидая, когда дизайнер покончит с дизайном) ... Фактически, это первый раз, когда я ценю преимущества TDD, я привык думать, что это совершенно глупо и бесполезно, но я ошибся :)
P.S .: В этой теме , @tvanfosson устанавливает CachePolicy для контекста (я думаю), может кто-нибудь объяснить это и почему, возможно, мне нужно это сделать, пожалуйста?
Заранее спасибо.