我正在用 MVC5和新的 OWIN 认证中间件尝试 VS2013RC 中的一些新东西。
因此,我习惯于使用 [Authorize]属性来按角色限制操作,但是我尝试使用基于声明/活动的授权,而且我找不到与之等效的属性。
[Authorize]
有没有明显漏掉的地方,还是要我自己卷?我还以为会有个开箱即用的呢。
我想我特别要找的是类似 [Authorize("ClaimType","ClaimValue")]的东西。
[Authorize("ClaimType","ClaimValue")]
先谢谢你。
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")] public ActionResult Delete(int id) { _customer.Delete(id); return RedirectToAction("CustomerList"); }
属性类
我的版本是这样的: 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")]来限制访问。
[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(); }
来源 。