我是asp.net安全人员。 首先让我道歉,在音乐商店样本或单元测试之外,这些都没有被记录,并且它们仍然在暴露的API方面得到了改进。 详细的文档是 这里 。
我们不希望您编写自定义授权属性。如果你需要这样做我们做错了什么。相反,你应该写授权 要求 。
授权作用于身份。身份通过身份验证创建。
您在评论中说要检查标题中的会话ID。您的会话ID将成为身份的基础。如果你想使用 Authorize 您要编写一个身份验证中间件来获取该标头并将其转换为经过身份验证的属性 ClaimsPrincipal 。然后,您将在授权要求中检查该内容。授权要求可以像您一样复杂,例如,这是一个对当前身份提出出生日期索赔的要求,并且如果用户超过18岁则会授权;
Authorize
ClaimsPrincipal
public class Over18Requirement : AuthorizationHandler<Over18Requirement>, IAuthorizationRequirement { public override void Handle(AuthorizationHandlerContext context, Over18Requirement requirement) { if (!context.User.HasClaim(c => c.Type == ClaimTypes.DateOfBirth)) { context.Fail(); return; } var dateOfBirth = Convert.ToDateTime(context.User.FindFirst(c => c.Type == ClaimTypes.DateOfBirth).Value); int age = DateTime.Today.Year - dateOfBirth.Year; if (dateOfBirth > DateTime.Today.AddYears(-age)) { age--; } if (age >= 18) { context.Succeed(requirement); } else { context.Fail(); } } } }
然后在你的 ConfigureServices() 功能你把它连接起来
ConfigureServices()
services.AddAuthorization(options => { options.AddPolicy("Over18", policy => policy.Requirements.Add(new Authorization.Over18Requirement())); });
最后将其应用于控制器或操作方法
[Authorize(Policy = "Over18")]
基于Derek Greer 的 大 强> 回答,我用枚举做了。
这是我的代码示例:
public enum PermissionItem { User, Product, Contact, Review, Client } public enum PermissionAction { Read, Create, } public class AuthorizeAttribute : TypeFilterAttribute { public AuthorizeAttribute(PermissionItem item, PermissionAction action) : base(typeof(AuthorizeActionFilter)) { Arguments = new object[] { item, action }; } } public class AuthorizeActionFilter : IAuthorizationFilter { private readonly PermissionItem _item; private readonly PermissionAction _action; public AuthorizeActionFilter(PermissionItem item, PermissionAction action) { _item = item; _action = action; } public void OnAuthorization(AuthorizationFilterContext context) { bool isAuthorized = MumboJumboFunction(context.HttpContext.User, _item, _action); // :) if (!isAuthorized) { context.Result = new ForbidResult(); } } } public class UserController : BaseController { private readonly DbContext _context; public UserController( DbContext context) : base() { _logger = logger; } [Authorize(PermissionItem.User, PermissionAction.Read)] public async Task<IActionResult> Index() { return View(await _context.User.ToListAsync()); } }