如何使用Asp.NetCore实现基于权限的访问控制我正在尝试使用aspnetcore实现基于权限的访问控制.为了动态管理用户角色和权限(create_product、delete_product等),它们存储在数据库中。数据模型类似于http://sofzh.miximages.com/c%23/CHMPE.png在aspnetcore之前(在MVC5中)我使用了这样的自定义AuthorizeAttribute来处理问题:publicclassCustomAuthorizeAttribute:AuthorizeAttribute{private只读字符串_permissionName{得到;放;}[注入]publicIAccessControlService_accessControlService{get;放;}publicCustomAuthorizeAttribute(stringpermissionName=""){_permissionName=permissionName;}publicoverridevoidOnAuthorization(AuthorizationContextfilterOnforContext){base.;varuser=_accessControlService.GetUser();if(PermissionName!=""&&!user.HasPermission(_permissionName)){//设置错误结果filterContext.HttpContext.Response.StatusCode=403;返回;}filterContext.HttpContext.Items["CUSTOM_USER"]=user;然后我在下面的操作方法中使用它:[HttpGet][CustomAuthorize(PermissionEnum.PERSON_LIST)]publicActionResultIndex(PersonListQueryquery){}此外,我在视图中使用HttpContext。Items["CUSTOM_USER"]显示或隐藏html部分:@if(CurrentUser.HasPermission("")){}当我决定切换aspnetcore时,我的所有计划都失败了,因为AuthorizeAttribute没有虚拟OnAuthorization方法。我尝试了一些方法来解决这个问题。它们是:我无法弄清楚哪种方式最适合我的场景以及如何实现它。第一个问题:MVC5实现的不好吗?第二个问题:你对实施aspnetcore有什么建议吗?根据评论,这里有一个关于如何使用基于策略的授权的示例:}publicPermissionEnumPermission{get;}}公共类PermissionHandler:AuthoronlyvprivateIUserPermissionsRepositorypermissionRepository;publicPermissionHandler(IUserPermissionsRepositorypermissionRepository){if(permissionRepository==null)thrownewArgumentNullException(nameof(permissionRepository));this.permissionRepository=permissionRepository;}protectedoverridevoidHandle(AuthorizationContextcontext,PermissionRequirementrequirement){if(context.User==null){//没有用户授权。或者调用context.Fail()以确保失败//因为此要求的另一个处理程序可能会成功returnnull;}boolhasPermission=permissionRepository.CheckPermissionForUser(context.User,requirement.Permission);如果(hasPermission){context.Succeed(要求);}}}并在Startup类中注册它:services.AddAuthorization(options=>{UserDbContextcontext=...;foreach(varpermissionincontext.Permissions){//假设.Permission是枚举options.AddPolicy(permission.Permission.ToString(),policy=>policy.Requirements.Add(newPermissionRequirement(permission.Permission)));}});//将其注册为范围,因为它使用可能使用dbcontextservices.AddScope()的存储库;最后在控制器[HttpGet][Authorize(Policy=PermissionEnum.PERSON_LIST.ToString())]publicActionResultIndex(PersonListQueryquery){...}这个解决方案的优点是您还可以为需求提供多个处理程序,即如果第一个处理程序成功,第二个处理程序可以确定它是失败的,并且您可以使用基于资源的授权而无需额外的努力基于策略的方法是ASP.NET核心团队执行此操作的首选方法。来自blowdart:我们不希望您编写自定义授权属性。如果您需要这样做,我们做错了什么。相反,您应该编写授权要求。对于不需要为每个权限添加策略的解决方案,请参阅我对另一个问题的回答。它允许您使用您想要的任何自定义属性来装饰您的控制器和操作,并在AuthorizationHandler中访问它们。我有同样的要求,我已经按照下面的方式完成了,对我来说效果很好。我正在使用.NetCore2.0Webapi[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=true,Inherited=true)]publicclassCheckAccessAttribute:AuthorizeAttribute,IAuthorizationFilter{privatestring[]_permission];){_permission=许可;}publicvoidOnAuthorization(AuthorizationFilterContextcontext){varuser=context.HttpContext.User;如果(!user.Identity.IsAuthenticated){返回;}IRepository服务=(IRepositoryWrapper)context.HttpContext.RequestServices.Get(typeof(IRepository));varsuccess=service.CheckAccess(用户名,_permission.ToList());如果(!成功){context.Result=JsonFormatter.GetErrorJsonObject(CommonResource.error_unauthorized,StatusCodeEnum.Forbidden);返回;}返回;在Controller中使用如上图是C#学习教程:HowtouseAsp.NetCoretoimplementpermission-basedaccesscontrol所有内容分享,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注—[HttpPost][CheckAccess(Permission.CreateGroup)]publicJsonResultPOST([FromBody]Groupgroup){//你的代码api代码在这里。}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
