MVC5声明 Authorize 属性的版本

我正在用 MVC5和新的 OWIN 认证中间件尝试 VS2013RC 中的一些新东西。

因此,我习惯于使用 [Authorize]属性来按角色限制操作,但是我尝试使用基于声明/活动的授权,而且我找不到与之等效的属性。

有没有明显漏掉的地方,还是要我自己卷?我还以为会有个开箱即用的呢。

我想我特别要找的是类似 [Authorize("ClaimType","ClaimValue")]的东西。

先谢谢你。

54104 次浏览
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
_customer.Delete(id);
return RedirectToAction("CustomerList");
}

属性类

  1. 您不会特别检查声明,而是检查操作/资源对。将实际的索赔/数据检查分解到授权管理器中。关注点分离。
  2. MVC 和声明主体权限不是很匹配,它抛出了一个 SecurityException 并且不是单元测试友好的。

我的版本是这样的: Http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

我最后只是编写了一个简单的属性来处理它。如果没有一些额外的配置,我就无法在框架中找到任何东西。以下列出。

public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
private string claimType;
private string claimValue;
public ClaimsAuthorizeAttribute(string type, string value)
{
this.claimType = type;
this.claimValue = value;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.User as ClaimsPrincipal;
if (user != null && user.HasClaim(claimType, claimValue))
{
base.OnAuthorization(filterContext);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}

当然,如果您愿意以某种方式使用控制器-动作-谓词三元组来表示索赔,那么您可以删除类型和值参数。

我发现您仍然可以对角色和用户以及声明使用 Authorization 属性。
为了实现这一点,您的声明身份必须包括两种特定的声明类型:

    ClaimTypes.Name

还有

    ClaimTypes.Role

然后在从 OAuthAuthorizationServerProvider 派生的类中,在您使用的 GrantXX 方法中,当您创建声明身份时,添加以下两个声明。

例如:

    var oAuthIdentity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, context.ClientId),
new Claim(ClaimTypes.Role, "Admin"),
}, OAuthDefaults.AuthenticationType);

然后在任何操作上都可以使用 [Authorize(Roles ="Admin")]来限制访问。

在 ASP.NET Core 3中,您可以像下面这样配置安全策略:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();


services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
}

然后使用 AuthorizeAttribute 要求用户满足特定策略的需求(换句话说,满足支持该策略的声明)。

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
return View();
}

来源