我正在尝试将身份用于我正在开发的一个新应用程序。关于它的最低可用信息使它很难理解。
根据我对身份的理解,我可以创建角色(即管理员、超级用户、用户...)对于控制器中的每个操作,我可以限制角色是否可以访问该操作。对于典型的应用程序来说,这是一种不错的方法。但在我的应用程序中,我需要对访问级别进行更深层次的控制。我需要能够有更多的控制,而不是基于角色的身份验证。
在一个典型的应用程序中,我可以将其添加到控制器中的操作方法[Authorize(Roles = "Admin")]
上,只有拥有Admin
的用户才有权访问它。
但是,我希望能够添加个人权限,并且不确定是否可以使用Identity。(也许与索赔有关?)
这是我的想法,我希望能够做这样的事情
// In a Razor view I want to be able to do this
// Note: HasPermission is not real method, but is something I am posting
// to explain what I am looking for
if(User.HasPermission("Edit Account")){
// Show the Edit button
}
if(User.HasPermission("Add Account")){
// Show the Add Button
}
然后,在我想做的动作方法中,可以做这样的事情。
[Authorize( HasPermission = "Edit Account")]
public ActionResult Edit()
{
// Handle the edit
}
[Authorize( HasPermission = "Add Account")]
public ActionResult Add()
{
// Handle the addition
}
该应用程序将有许多权限(即编辑帐户,添加帐户,删除帐户...)我将为一个用户分配多个权限。拥有Add Account
权限的用户将能够添加帐户。
这样的事情可以在开箱即用的身份下完成吗?如何才能在不使问题复杂化的情况下开始呢?
发布于 2016-12-04 01:43:25
声明告诉你用户是谁,而不是用户能做什么。例如,它们可能是对用户的名字、他们的电子邮件地址等的声明。也可能会声明用户的角色,或者他们所属的组(有一个细微的区别,但现在让我们忽略它)。例如,可能存在角色声明,声明用户是会计和经理。
正如您所注意到的,这些声明并没有告诉您用户可以做什么。这种情况下,会计可以编辑帐户,但索赔不会告诉你。不知何故,您必须将角色(和其他声明)转换为权限(如您所称的权限)。
不幸的是,.NET框架中没有这样做的标准组件。唯一接近它的是AzMan,但现在它已经被弃用了。
这意味着你有两个选择:
你可以扮演你自己的角色。这并不太难。基本上,您需要一个具有角色和任务之间多对多关系的数据结构,以及任务和单个细粒度权限之间的多对多关系。Azman模型是一个很好的灵感来源。
另一种方法是硬编码应用程序中的角色,这是许多人采取的方法,对于简单的应用程序来说可能已经足够好了。这就是[Authorize(Roles = "Accountant")]
的用武之地。显然,每当业务组织发生变化时,此模型都需要重新编译,但如果不经常发生,这可能是可以的。
不幸的是,没有更好的答案。
发布于 2016-12-26 16:30:30
您可以通过向基础添加权限概念来扩展身份工作流。您应该关心的最重要的事情是当前模型和新添加的功能之间的关系。我在我的最新项目中做到了这一点,并将其作为开源Permission Extension to Identity 2 membership system here发布。您可以阅读自述文件,也可以提出您的问题或自己扩展库。
作为一个简短的示例,您可以像这样使用它:
第一种方法:
// GET: /Manage/Index
[AuthorizePermission(Name = "Show_Management", Description = "Show the Management Page.")]
public async Task<ActionResult> Index(ManageMessageId? message)
{
//...
}
第二种方法:
// GET: /Manage/Users
public async Task<ActionResult> Users()
{
if (await HttpContext.AuthorizePermission(name: "AllUsers_Management", description: "Edit all of the users information."))
{
return View(db.GetAllUsers());
}
else if (await HttpContext.AuthorizePermission(name: "UnConfirmedUsers_Management", description: "Edit unconfirmed users information."))
{
return View(db.GetUnConfirmedUsers());
}
else
{
return View(new List<User>());
}
}
https://stackoverflow.com/questions/39561049
复制相似问题