我正在尝试VS2013 RC中的一些新东西,其中包含MVC5和新的OWIN身份验证中间件。
因此,我习惯于 使用 [Authorize]
属性按角色限制操作,但我正在尝试使用基于声明/活动的授权,但我找不到它的等效属性。
我是否缺少一个明显的或我需要自己滚动?我有点期待有一个开箱即用的。
我特别要寻找的是我想[Authorize("ClaimType","ClaimValue")]
的东西。
提前谢谢。
我最终只编写了一个简单的属性来处理它。如果没有一堆额外的配置,我无法在框架中找到开箱即用的任何内容。下面列出。
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);
}
}
}
当然,如果您愿意以某种方式使用控制器-动作-动词三元组进行声明,则可以删除类型和值参数。
- 您不会专门检查声明,而是检查操作/资源对。将实际声明/数据签入授权管理器。关注点分离。
- MVC 和 ClaimsPrincipalPermission 不是很好的匹配。它抛出一个安全异常,并且对单元测试不友好。
我的版本在这里:http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/
我发现您仍然可以将授权属性与角色和用户以及声明一起使用。
为此,您的 ClaimIdentity 必须包含 2 种特定的声明类型:
ClaimTypes.Name
和
ClaimTypes.Role
然后在从 OAuthAuthorizationServerProvider 派生的类中,在您使用的 GrantXX 方法中,当您创建 ClaimsIdentity 时,添加这 2 个声明。
例:
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();
}
源。
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
_customer.Delete(id);
return RedirectToAction("CustomerList");
}
ClaimsPrincipalPermissionAttribute Class