Man*_*eld 11 c# authorization asp.net-membership asp.net-mvc-3
在我的asp.net mvc3应用程序中,我有一个自定义授权属性,如下所示.
public class CustomAuthorize : AuthorizeAttribute
{
public IAccountRepository AccountRepository { get; set; }
public CustomAuthorize()
{
this.AccountRepository = new UserModel();
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
base.AuthorizeCore(httpContext);
return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我的[CustomAuthorize]控制器操作上有标记,AuthorizeCore方法工作正常 - 它执行我想要的逻辑(确保帐户实际启用),然后返回.
但是,HandleUnauthorizedRequest根据我的理解它应该允许我控制未授权请求的行为的重写方法根本不运行.我在那里放了一个断点,我把代码放在那里,我未经授权访问我的应用程序,代码永远不会运行.
我错过了什么?
编辑:我做了一些更多的研究,发现了一些其他人有这个问题,但不幸的是没有解决方案.
EDIT2:示例代码
[CustomAuthorize]
public class UserController: Controller
{
public UserController()
{
//do stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
编辑3:@Fabio
这就是我想要做的.我有一个工作正常的登录页面(表单身份验证) - 它调用我的自定义登录,然后调用我的AuthorizeCore覆盖.我的应用程序使用大量的ajax调用,我的最终目标是每当用户使用该应用程序时,管理员禁用它们,在禁用后进行ajax调用(尽管仍在登录)应该将其注销.但是,为了做到这一点,我想返回一个自定义响应,如果用户正在进行ajax调用,为此,我需要ovverride HandleUnauthorizedRequest.但是如果用户登录,我的Authorize Core(以及扩展名HandleUnauthorizedRequest)将被忽略(尽管事实上我已经在ajax正在调用的所有控制器操作上使用了标签).
简而言之:我想在每个请求上授权用户,而不仅仅是登录请求(这似乎是会员提供商现在正在做的事情)
我最后改变了我的方法.我实现了单独的权限检查,然后每次都会调用AuthorizeCore(而不是缓存,我猜之前发生了什么).
有趣的是,在HandleUnauthorizedRequest覆盖上设置断点仍然不会中断,但将其置于方法中.很奇怪,把我扔了一会儿,但我现在已经解决了.
代码,如果有人有兴趣:
public class CustomAuthorize : AuthorizeAttribute
{
public string Permissions { get; set; }
private IAccountRepository AccountRepository { get; set; }
private string[] permArray { get; set; }
private string reqStatus { get; set; }
public CustomAuthorize()
{
this.AccountRepository = new UserModel();
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
base.AuthorizeCore(httpContext);
if (Permissions != null) {
permArray = Permissions.Trim().Split(' ');
if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) {
this.reqStatus = "permission";
return AccountRepository.hasPermissions(permArray);
} else {
return false;
}
} else {
return AccountRepository.isEnabled(httpContext.User.Identity.Name);
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (this.reqStatus == "permission") {
filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect"));
} else {
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我用这个装饰控制器:
[CustomAuthorize(Permissions="test_perm")]
| 归档时间: |
|
| 查看次数: |
11015 次 |
| 最近记录: |