Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 MVC4中Authorize属性上的自定义角色_Asp.net Mvc 4_Action Filter - Fatal编程技术网

Asp.net mvc 4 MVC4中Authorize属性上的自定义角色

Asp.net mvc 4 MVC4中Authorize属性上的自定义角色,asp.net-mvc-4,action-filter,Asp.net Mvc 4,Action Filter,这是我的密码: [HttpGet, Authorize(Roles = "Admin")] public ActionResult ActivityLog() { 'code to do stuff return View(model); } 这很简单-如果你是“管理员”的角色,你可以进入这个行动。但是,我有一个自定义ActionFilter,它用所有自定义声明填充我的IPrinciple(我不能使用ADF发送声明,因为我有一个用于多个站点的ADF,所以我的声明必须用于该特定站点)

这是我的密码:

[HttpGet, Authorize(Roles = "Admin")]
public ActionResult ActivityLog()
{
  'code to do stuff

  return View(model);
}
这很简单-如果你是“管理员”的角色,你可以进入这个行动。但是,我有一个自定义ActionFilter,它用所有自定义声明填充我的IPrinciple(我不能使用ADF发送声明,因为我有一个用于多个站点的ADF,所以我的声明必须用于该特定站点)

我将自定义过滤器从Global.asax文件绑定到应用程序中

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
  filters.Add(new CustomFilter());
}
问题是因为Authorize属性在我的自定义筛选器之前运行,所以我没有 “管理员”角色,我得到一个401-未经授权的访问错误。如何保留筛选器并在授权属性中使用“角色”标记?

关于

“问题是因为Authorize属性在自定义之前运行 筛选器我没有“管理员”角色

您可以创建另一个Authorize属性,该属性首先访问声明,然后创建设置管理员的标准授权

执行此操作的方法是注册并指定Order属性

filters.Add(new AuthorizeAttribute(), 1);
filters.Add(new CustomAuthorizeAttribute(), 2);
有关详细信息,请参阅

“问题是因为Authorize属性在自定义之前运行 筛选器我没有“管理员”角色

您可以创建另一个Authorize属性,该属性首先访问声明,然后创建设置管理员的标准授权

执行此操作的方法是注册并指定Order属性

filters.Add(new AuthorizeAttribute(), 1);
filters.Add(new CustomAuthorizeAttribute(), 2);

有关MVC4中不再支持Authorization属性的详细信息,请参见。现在应该使用新的AllowAnonymous属性

ASP.NET MVC 4包含了新的AllowAnonymous属性,您不再需要编写该代码。在global.asax中全局设置authorized属性,然后将方法列入白名单(即,使用AllowAnonymous属性显式地修饰方法),您要选择退出授权的方法被认为是保护操作方法的最佳做法

如果试图使用操作筛选器并重写AuthorizeCore,则会出现编译时错误“没有合适的重写方法”

以下是在MVC 4中执行属性授权的另一种方法:

public class AuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
        response.Headers.Add("Location", "http://www.google.com");
        actionContext.Response = response;
    }
}

MVC 4中不再支持AuthorizeAttribute。现在应该使用新的AllowAnonymous属性

ASP.NET MVC 4包含了新的AllowAnonymous属性,您不再需要编写该代码。在global.asax中全局设置authorized属性,然后将方法列入白名单(即,使用AllowAnonymous属性显式地修饰方法),您要选择退出授权的方法被认为是保护操作方法的最佳做法

如果试图使用操作筛选器并重写AuthorizeCore,则会出现编译时错误“没有合适的重写方法”

以下是在MVC 4中执行属性授权的另一种方法:

public class AuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
        response.Headers.Add("Location", "http://www.google.com");
        actionContext.Response = response;
    }
}