首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在asp.net身份中使用权限而不是角色对用户进行身份验证?

如何在asp.net身份中使用权限而不是角色对用户进行身份验证?
EN

Stack Overflow用户
提问于 2016-09-19 02:14:58
回答 2查看 872关注 0票数 2

我正在尝试将身份用于我正在开发的一个新应用程序。关于它的最低可用信息使它很难理解。

根据我对身份的理解,我可以创建角色(即管理员、超级用户、用户...)对于控制器中的每个操作,我可以限制角色是否可以访问该操作。对于典型的应用程序来说,这是一种不错的方法。但在我的应用程序中,我需要对访问级别进行更深层次的控制。我需要能够有更多的控制,而不是基于角色的身份验证。

在一个典型的应用程序中,我可以将其添加到控制器中的操作方法[Authorize(Roles = "Admin")]上,只有拥有Admin的用户才有权访问它。

但是,我希望能够添加个人权限,并且不确定是否可以使用Identity。(也许与索赔有关?)

这是我的想法,我希望能够做这样的事情

代码语言:javascript
运行
复制
// 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
}

然后,在我想做的动作方法中,可以做这样的事情。

代码语言:javascript
运行
复制
[Authorize( HasPermission = "Edit Account")]
public ActionResult Edit()
{
    // Handle the edit
}

[Authorize( HasPermission = "Add Account")]
public ActionResult Add()
{
    // Handle the addition
}

该应用程序将有许多权限(即编辑帐户,添加帐户,删除帐户...)我将为一个用户分配多个权限。拥有Add Account权限的用户将能够添加帐户。

这样的事情可以在开箱即用的身份下完成吗?如何才能在不使问题复杂化的情况下开始呢?

EN

回答 2

Stack Overflow用户

发布于 2016-12-04 01:43:25

声明告诉你用户是谁,而不是用户能做什么。例如,它们可能是对用户的名字、他们的电子邮件地址等的声明。也可能会声明用户的角色,或者他们所属的组(有一个细微的区别,但现在让我们忽略它)。例如,可能存在角色声明,声明用户是会计和经理。

正如您所注意到的,这些声明并没有告诉您用户可以做什么。这种情况下,会计可以编辑帐户,但索赔不会告诉你。不知何故,您必须将角色(和其他声明)转换为权限(如您所称的权限)。

不幸的是,.NET框架中没有这样做的标准组件。唯一接近它的是AzMan,但现在它已经被弃用了。

这意味着你有两个选择:

你可以扮演你自己的角色。这并不太难。基本上,您需要一个具有角色和任务之间多对多关系的数据结构,以及任务和单个细粒度权限之间的多对多关系。Azman模型是一个很好的灵感来源。

另一种方法是硬编码应用程序中的角色,这是许多人采取的方法,对于简单的应用程序来说可能已经足够好了。这就是[Authorize(Roles = "Accountant")]的用武之地。显然,每当业务组织发生变化时,此模型都需要重新编译,但如果不经常发生,这可能是可以的。

不幸的是,没有更好的答案。

票数 0
EN

Stack Overflow用户

发布于 2016-12-26 16:30:30

您可以通过向基础添加权限概念来扩展身份工作流。您应该关心的最重要的事情是当前模型和新添加的功能之间的关系。我在我的最新项目中做到了这一点,并将其作为开源Permission Extension to Identity 2 membership system here发布。您可以阅读自述文件,也可以提出您的问题或自己扩展库。

作为一个简短的示例,您可以像这样使用它:

第一种方法:

代码语言:javascript
运行
复制
// GET: /Manage/Index
[AuthorizePermission(Name = "Show_Management", Description = "Show the Management Page.")]
public async Task<ActionResult> Index(ManageMessageId? message)
{
    //...
}

第二种方法:

代码语言:javascript
运行
复制
// 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>());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39561049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档