ASP.net5 中的授权

本文关键字:授权 net5 ASP | 更新日期: 2023-09-27 18:32:32

我正在尝试查看 ASP.net5 中是否有"开箱即用"的东西用于授权我的应用程序需求。我正在使用基于组/权限的方法进行授权。使用 Identity3 我正在使用角色作为组,然后我从中创建了权限。每个权限都有一个链接到的资源以及 1 个或多个值,例如:

资源 = 页面,权限 = 添加、更新、查看、删除

另一个复杂问题是这些组具有动态名称和动态权限!!

我已经开始阅读有关ASP.net5中的授权的信息,似乎我找到了称为策略的东西,听起来不错。它似乎迫使您使用声明,如果我使用 ClaimsTransformer 获取我的所有权限并将它们添加为 DB 中的声明,这是可能的。但是,我认为我必须为每个资源上的每个权限创建一个策略是否正确?这似乎需要很多设置。

ASP.net5 中已经构建了哪些我不知道的内容可供我使用?喜欢这样的属性

[Authorize("Page", "Delete")]

我可以将其添加到页面控制器删除方法中。

如果我必须使用某种服务并将其DI到控制器中来实现这一点,那么这也很好。

ASP.net5 中的授权

有一个 ClaimsPrincipalPermissionAttribute 可以满足您的要求。

或者,您可以实现自己的授权属性。

我使用AspNet.Security.OpenIdConnect.Server进行授权。但你也可以看看OpenIddict

在任何情况下,您都可以像这样将授权属性添加到所需的任何方法

[Authorize(Roles = "Administrator,SimpleUser,AnOtherRole")]
public void MyMethod() {}

基于资源的授权可能会满足您的需求,但我对页面是资源而不是页面所操作的内容感到有点困惑。

采用您的页面/删除组合,我想您的页面删除

操作采用一个参数,指示要删除的页面,而不是页面/删除资源?(如果不是这种情况,那么这种方法当然不会奏效(

在这种情况下,你会做类似的事情

[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 解析的,因此可以将用户注入到处理程序中的权限解析程序,这将避免使用声明转换。

ASP.NET 提供了开箱即用的身份验证机制,易于使用,例如:

public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index()
    {
        ViewBag.Message = "This can be viewed only by authenticated users only";
        return View();
    }
    [Authorize(Roles="admin")]
    public ActionResult AdminIndex()
    {
        ViewBag.Message = "This can be viewed only by users in Admin role only";
        return View();
    }
}

查看本教程

或者,如果您想要更复杂的机制,则可以基于 ASP.NET 成员资格提供程序实现自己的memberhsip提供程序