MVC5声明Authorize属性的版本

时间:2013-10-14 15:32:20

标签: asp.net-mvc asp.net-mvc-5 claims

我正在使用MVC5和新的OWIN认证中间件尝试VS2013 RC中的一些新功能。

所以,我习惯使用[Authorize]属性来限制角色的操作,但我正在尝试使用基于声明/活动的授权,而我找不到它的等效属性。

是否有一个明显的我遗失或者我需要自己动手?我有点希望有一个开箱即用。

我想要的具体是[Authorize("ClaimType","ClaimValue")]我想的。

提前致谢。

5 个答案:

答案 0 :(得分:63)

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

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);
        }
    }
}

当然,如果您愿意以某种方式使用controller-action-verb triplet来声明索引,则可以删除类型和值params。

答案 1 :(得分:30)

  1. 您不会专门检查索赔,而是检查操作/资源对。将实际的索赔/数据检查分解为授权管理器。分离关注点。
  2. MVC和ClaimsPrincipalPermission不是很好的匹配。它抛出SecurityException并且不是单元测试友好。
  3. 我的版本在这里: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

答案 2 :(得分:8)

我发现您仍然可以将声明属性与角色和用户一起使用 为此,您的ClaimsIdentity必须包含两种特定的声明类型:

    ClaimTypes.Name

    ClaimTypes.Role

然后在您从OAuthAuthorizationServerProvider派生的类中,在您使用的GrantXX方法中,在创建ClaimsIdentity时,添加这两个声明。

示例:

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

然后,您可以使用[Authorize(Roles ="Admin")]来限制访问。

答案 3 :(得分:3)

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

ClaimsPrincipalPermissionAttribute Class

答案 4 :(得分:1)

在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();
}

Source