我正在尝试查看ASP.net5中是否存在“开箱即用”的内容,以便对我的应用程序需求进行授权。我正在使用基于组/权限的方法进行授权。使用Identity3我使用角色作为组,然后我已经创建了权限。每个权限都有一个链接到的资源以及一个或多个值,如:
资源=页面,权限=添加,更新,查看,删除
另一个复杂因素是这些组具有动态名称和动态权限!!
我已经开始阅读ASP.net5中的授权,似乎我找到了一些名为Policies的东西,听起来不错。它似乎强迫您使用声明,如果我使用ClaimsTransformer获取我的所有权限并将其添加为Db声明,则可以使用声明。但我是否正确地认为我必须为每个资源上的每个权限创建一个策略?这似乎很多设置。
我可以使用的ASP.net5中是否有任何我不知道的内容?像这样的属性
[Authorize("Page", "Delete")]
我可以添加到PageController Delete方法。
如果我必须使用某种服务和DI进入控制器来实现这一点,那么那也没关系。
答案 0 :(得分:0)
有ClaimsPrincipalPermissionAttribute符合您的要求。
或者您可以实施自己的AuthorizeAttribute。
答案 1 :(得分:0)
我使用AspNet.Security.OpenIdConnect.Server进行授权。但您也可以查看OpenIddict
在任何情况下,您都可以将Authorize属性添加到您想要的任何方法
[Authorize(Roles = "Administrator,SimpleUser,AnOtherRole")]
public void MyMethod() {}
答案 2 :(得分:0)
Resource based authorization可能会满足您的需求,但我对作为资源的页面感到困惑,而不是页面的作用。
采用你的页面/删除组合,我认为你的页面删除操作不是资源是页面,而是一个参数,指示要删除的页面? (如果不是这种情况,那么这种方法当然不会起作用)
在这种情况下,您可以执行类似
的操作[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解决,您可以将用户注入权限解析器到处理程序中,这样可以避免使用声明转换。
答案 3 :(得分:-2)
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 Membership Provider
实现自己的memberhsip提供程序