好的,跟进这个帖子,以下是我想到的...
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属性的方式。但是,如果重写的属性与初始属性(基类中的属性)的类型不同,它是否也会隐藏它或创建完全不同的属性?
附注:在这个线程上,@tvanfosson正在设置上下文的CachePolicy(我想),有人能解释一下为什么我可能需要这样做吗?
谢谢。