79

我正在使用 MVC5 和新的 OWIN 身份验证中间件尝试 VS2013 RC 中的一些新内容。

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

是否有一个明显的我失踪或我需要自己推出?我有点期望会有一个开箱即用的。

我正在寻找的具体内容与[Authorize("ClaimType","ClaimValue")]我想的类似。

提前致谢。

4

5 回答 5

77

我最终只写了一个简单的属性来处理它。如果没有一堆额外的配置,我在开箱即用的框架中找不到任何东西。下面列出。

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

当然,如果您乐于以某种方式使用控制器-动作-动词三元组来进行声明,则可以删除类型和值参数。

于 2015-03-02T19:37:21.347 回答
30
  1. 您不会专门检查声明,而是检查操作/资源对。将实际声明/数据检查分解到授权管理器中。关注点分离。
  2. MVC 和 ClaimsPrincipalPermission 不是很好的匹配。它抛出一个 SecurityException 并且对单元测试不友好。

我的版本在这里: http: //leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

于 2013-10-21T07:05:32.840 回答
9

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

    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")]用来限制访问的任何操作上。

于 2016-07-17T22:54:41.260 回答
4

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

来源

于 2019-10-24T18:29:54.800 回答
3
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
    _customer.Delete(id);
    return RedirectToAction("CustomerList");
}

ClaimsPrincipalPermissionAttribute 类

于 2013-10-14T16:12:41.710 回答