我正在尝试查看ASP.net5中是否有一些“开箱即用”的东西可以授权我的应用程序需要。我使用基于组/权限的方法进行授权。使用Identity3时,我将角色用作组,然后从中创建权限。每个权限都有一个链接的资源和一个或多个值,例如:
资源=页面,权限=添加、更新、查看、删除
另一个复杂的问题是,组具有动态名称和动态权限!
我开始阅读ASP.net5中关于授权的文章,似乎我找到了一种叫做策略的东西,听起来不错。它似乎强制您使用声明,如果我使用ClaimsTransformer获取所有权限并将它们作为声明添加到数据库中,这是可能的。但是,我必须为每个权限、每个资源创建一个策略,这样的想法正确吗?这看起来需要很多的设置。
有没有什么我不知道的东西已经内置在ASP.net5中,我可以使用?就像这样的属性
[Authorize("Page", "Delete")]我可以将其添加到PageController删除方法中。
如果我必须在控制器中使用某种类型的服务和DI来实现这一点,那么也没问题。
发布于 2016-01-29 14:43:21
有一个ClaimsPrincipalPermissionAttribute可以满足您的需求。
或者,您可以实现自己的AuthorizeAttribute。
发布于 2016-01-29 15:41:06
我使用AspNet.Security.OpenIdConnect.Server进行授权。但是你也可以看看OpenIddict
在任何情况下,您都可以向所需的任何方法添加Authorize属性,如下所示
[Authorize(Roles = "Administrator,SimpleUser,AnOtherRole")]
public void MyMethod() {}发布于 2016-01-29 21:54:50
Resource based authorization可能会满足您的需求,但我有点困惑于页面是资源,而不是页面的作用对象。
以您的Page/Delete组合为例,我可以想象,您的Page Delete操作接受一个参数,指示要删除的页面,而不是资源是Page。(如果不是这样,那么这种方法当然不会起作用)
在本例中,您将执行如下操作
[Authorize]
public class PageController : Controller
{
IAuthorizationService _authorizationService;
public PageController(IAuthorizationService authorizationService)
{
_authorizationService = authorizationService;
}
public Delete(int pageId)
{
var page = pageRepo.GetPage(pageId);
if (await authorizationService.AuthorizeAsync(User, page, Operations.Delete))
{
return View(page);
}
else
{
return new ChallengeResult();
}
}
}为了实现这一点,您将基于页面和操作需求(或任何旧的需求,但参数化的操作需求意味着您可以相应地编写单个处理程序和分支)编写一个处理程序。
我们非常努力地从将数据放入属性中转移到需求中,因为坦率地说,属性中的数据是维护的噩梦。
需要注意的另一件事是:由于处理程序是通过DI解析的,因此您可以将用户的权限解析器注入到处理程序中,这将避免使用声明转换。
https://stackoverflow.com/questions/35078114
复制相似问题