【问题标题】:ASP.NET Identity and creating RoleFunctionsASP.NET 标识和创建 RoleFunctions
【发布时间】:2016-04-15 13:33:45
【问题描述】:

在选择“个人用户帐户”时,我使用的是 MVC6 Core 1.0 随附的最新最好的 Identity 3.x。

我的用户身份验证要求如下:

Users -> AspNetUsers  
Roles -> AspNetRoles  
UserRoles -> AspNetUserRoles   
RoleFunctions -> I don't see a table for this in the Identity db structure

RoleFunctions 是任何类型的系统函数,例如 DeleteCustomers、AccessToCustomerPage 等。

我将假设 ASP.NET Identity 不支持使用基于角色的身份验证的这一额外步骤,因此我将不得不自己创建表和相关函数。这是真的吗,还是对我来说都是这样,我只是没看到?

【问题讨论】:

  • 我认为您指的是政策。我猜您将拥有已知数量的角色功能,并且它们将在您的代码中被知道(除非您的目标是一些活力)?您可以考虑对它们进行硬编码并创建策略,例如“为了删除客户,用户必须拥有这个、这个和/或这个角色”。在这里查看:docs.asp.net/en/latest/security/authorization/…
  • 好吧,如果我有一堆全局常量用于所有角色函数并使用我不应该需要 RoleFunctions 表的策略,那么你的意思是?问题是我需要在功能级别而不是角色级别进行所有检查。例如:如果当前登录用户是包含 DeleteCustomer 的角色的一部分,则在视图模型中显示垃圾箱。

标签: asp.net asp.net-mvc asp.net-identity asp.net-core-1.0 asp.net-identity-3


【解决方案1】:

身份允许您根据控制器或控制器中的特定操作来确定授权。

[Authorize]
public void controllermethod(param) {}

在访问此操作或控制器之前,授权将需要身份验证。

因此,如果您想创建一个只有管理员才能执行的操作(或您创建的任何用户角色组),您可以在控制器方法上方放置

[Authorize(Roles="admin")]
public void controllerMethod(param) {}

角色可以接受字符串列表,例如 (Roles="Admin","Manager"),因此您可以将多个角色放在一个授权声明中。

您也可以在控制器级别执行此操作,强制控制器中的每个操作都遵守您的授权声明。基本上,如果你把它放在控制器声明之上,每个动作都会受到影响,但你可以将特定动作列入白名单

[AllowAnonymous]
public void nosecuritycontrolleraction {}

我希望这是您正在寻找的,您可以在这里找到更好的指南: http://www.asp.net/identity

更新 1 对于 DeleteCustomer 示例,我假设您在控制器中有一些方法来处理客户对象的删除。在这些方法之上,放置 [Authorize(Roles="CustomerAdmin")],然后只有在 UserRoles 中具有 customerAdmin 角色的用户才能使用该操作。

喜欢:

[Authorize(Roles="CustomerAdmin")]
public ActionResult DeleteCustomer(string/int id){}

【讨论】:

  • 这与我要找的很接近。您能否更新您的帖子以适应此示例:有一个名为 CustomerAdmin 的角色。我在哪里可以指定 CustomerAdmin 可以执行的功能?假设他们可以查看和删除客户。假设在 ViewModel 中,我只想为具有 CustomerAdmin 角色的用户显示一个垃圾桶图标。我宁愿检查一下用户的任何角色是否具有删除客户的功能,然后显示垃圾箱。这就是我的 RoleFunctions 部分发挥作用的地方。
  • 我在上面想说的是,我更喜欢在功能级别而不是角色级别进行所有检查。例如:如果当前登录用户是包含硬编码函数 DeleteCustomer 的角色的一部分,则在视图模型中显示垃圾箱。您将如何设置一个系统来执行此操作?
  • 对于 DeleteCustomer 示例,我假设您在控制器中有一些方法来处理客户对象的删除。在这些方法之上,放置 [Authorise(Roles="CustomerAdmin")] 然后只有在 UserRoles 中具有 customerAdmin 角色的用户才能使用该操作。
  • 对于前端方面,我不确定你想做什么,你可以检查控制器中的角色并根据你的角色返回不同的视图。基本上为不在您想要的角色的用户复制您的视图而不使用垃圾箱。或者,您可以使用 javascript 完成此操作,如果他们不在角色中,则将其隐藏,但我不建议这样做。
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 2013-11-24
  • 2016-04-25
  • 2014-03-12
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多