构造函数不执行,求教!!!

qqm05 2013-06-08 03:13:03
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class myAuthorize : AuthorizeAttribute
{
private readonly bool _authorize;
private bool _isPermissionFail = false;
public myAuthorize() {
string test = "断点";//在这里设置断点,F5调试时,并未进入这一步
if (HttpContext.Current.User.Identity.Name != "")
{
_authorize = true;
}
else
{
_authorize = false;
}
}
public myAuthorize(string permission)
{
string test = "断点";//在这里设置断点,,F5调试时,并未进入这一步
if (HttpContext.Current.User.Identity.Name != "")
{

_authorize = PermissionManager.CheckUserHasPermision(HttpContext.Current.User.Identity.Name, permission);
if (_authorize == false)
{
_isPermissionFail = true;
}
}
else
{
_authorize = false;
}
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return _authorize;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
//F5调试发现,程序直接跳过构造函数,执行到这里了
base.OnAuthorization(filterContext);
if (filterContext.HttpContext.Response.StatusCode == 403)
{
filterContext.Result = new RedirectResult("/Admin/Home/PermissionError");
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (_isPermissionFail)
{
filterContext.HttpContext.Response.Redirect("/Admin/Home/PermissionError");
}
else
{
//base.HandleUnauthorizedRequest(filterContext);
filterContext.HttpContext.Response.RedirectToRoute(new {Area="Admin",Controller="Home",Action="Login" });
}

}
}
还望各位大侠不吝赐教!!!
...全文
362 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqm05 2013-06-08
  • 打赏
  • 举报
回复
如5楼、6楼所言,那么,这个(想在AuthorizeAttribute 的类的Roles和Users过滤的基础上扩展个权限的验证,这个我也是从网上的代码的基础上改的,我后来发现怎么改都不行,于是测试了下他的源码,发现同样是不行的)我不知道怎么实现了,那我现在只能用Roles和Users来验证了,如果有高手有实现办法,还请多多分享,谢谢!,准备结贴了 namespace System.Web.Mvc { // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter { // 摘要: // 初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。 public AuthorizeAttribute(); // 摘要: // 获取或设置用户角色。 // // 返回结果: // 用户角色。 public string Roles { get; set; } // // 摘要: // 获取此特性的唯一标识符。 // // 返回结果: // 此特性的唯一标识符。 public override object TypeId { get; } // // 摘要: // 获取或设置授权用户。 // // 返回结果: // 授权用户。 public string Users { get; set; } // 摘要: // 重写时,提供一个入口点用于进行自定义授权检查。 // // 参数: // httpContext: // HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。 // // 返回结果: // 如果用户已经过授权,则为 true;否则为 false。 // // 异常: // System.ArgumentNullException: // httpContext 参数为 null。 protected virtual bool AuthorizeCore(HttpContextBase httpContext); // // 摘要: // 处理未能授权的 HTTP 请求。 // // 参数: // filterContext: // 封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。 protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext); // // 摘要: // 在过程请求授权时调用。 // // 参数: // filterContext: // 筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。 // // 异常: // System.ArgumentNullException: // filterContext 参数为 null。 public virtual void OnAuthorization(AuthorizationContext filterContext); // // 摘要: // 在缓存模块请求授权时调用。 // // 参数: // httpContext: // HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。 // // 返回结果: // 对验证状态的引用。 // // 异常: // System.ArgumentNullException: // httpContext 参数为 null。 protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext); } } 那么派生的类,我就只能这么写了: public class myAuthorize : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.HttpContext.Response.StatusCode == 403) { filterContext.Result = new RedirectResult("/Admin/Home/PermissionError"); } } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (HttpContext.Current.User.Identity.Name != "") { filterContext.HttpContext.Response.Redirect("/Admin/Home/PermissionError"); } else { //base.HandleUnauthorizedRequest(filterContext); filterContext.HttpContext.Response.RedirectToRoute(new {Area="Admin",Controller="Home",Action="Login" }); } } }
qqm05 2013-06-08
  • 打赏
  • 举报
回复
引用 7 楼 moonwrite 的回复:
突然想到一个测试的方法 OnAuthorization { int key = this.GetHashCode();//返回对象的实例ID } 你可以下断点,刷几次页面,如果每次key都是一样的 则说明单例了或缓存起来,所以构成出来后,就不会再构造了~
感谢楼上的耐心回答,这个返回的是0
moonwrite 2013-06-08
  • 打赏
  • 举报
回复
突然想到一个测试的方法 OnAuthorization { int key = this.GetHashCode();//返回对象的实例ID } 你可以下断点,刷几次页面,如果每次key都是一样的 则说明单例了或缓存起来,所以构成出来后,就不会再构造了~
moonwrite 2013-06-08
  • 打赏
  • 举报
回复
从 AuthorizeAttribute 派生 如果要从 AuthorizeAttribute 类派生,则派生的类型必须是线程安全的。 因此,不要在类型实例本身中(例如,在实例字段中)存储状态(除非该状态要应用于所有请求), 而应在 Items 属性中按请求存储状态,该属性可通过传递给 AuthorizeAttribute 的上下文对象进行访问。 必须是线程安全??这个是什么概念呢~ 不知道附加了什么特殊的东西~?
tcmakebest 2013-06-08
  • 打赏
  • 举报
回复
楼主对 Attribute 的类误用了,它是对应于 class 类的,而不是实例,大约等于静态变量吧。 所以它只会生成一次,因为你只对一个 class 使用这个 Attribute。 它的典型用法是在反射 class 的时候,可以获取它。
qqm05 2013-06-08
  • 打赏
  • 举报
回复
帖子分不多,还请各位大侠多多指教;我的另外一篇帖子(200分)因为没人回复还没结贴,现在想把它作为附加的悬赏分,大家可以去接分,谢谢大家,帖子地址: http://bbs.csdn.net/topics/390119212
qqm05 2013-06-08
  • 打赏
  • 举报
回复
感谢楼上两位的回答; [myAuthorize("后台管理")] public class ArticleController : BaseController { 调用的时候是没错的,而且程序第一次执行的时候,是能够进入到构造函数的; 但是,当我注销原来的用户,用另一用户去登陆了,再进入到控制器的时候,就不进入构造函数了
  • 打赏
  • 举报
回复
你是否正确调用了myAuthorize 该类,而不是直接写的AuthorizeAttribute
 [myAuthorize]
        public ActionResult Index()
        {
            ViewBag.Message = "欢迎使用 ASP.NET MVC!";
            return View();
        }
       
md5e 2013-06-08
  • 打赏
  • 举报
回复
他应该执行的是AuthorizeAttribute里面的构造方法,然后触发了OnAuthorization

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧