在ASP.NET MVC5 Web应用程序中向用户帐户添加声明的正确方法

时间:2014-04-11 17:17:38

标签: c# asp.net-mvc-5 asp.net-identity claims-based-identity asp.net-mvc-5.1

我正在开发一个具有以下相关属性的ASP.NET MVC5 Web应用程序:

  • 使用MVC5.1,Identity 2.0,不限于任何遗留的东西 - 可以使用最新的东西。
  • 用户属于至少一个组织。
  • 每个组织至少有一个组织管理员用户。
  • 组织管理员可以允许用户使用特定权限,例如成为另一个组织管理员。
  • 根据我的理解,处理此问题的一个好方法是使用声明。

除了默认声明之外,用户通常还可以拥有以下声明:

组织:{some guid} 组织管理员:{与上述相同的指导} 组织发布者:{再次引导}}

可能有超级管理员,甚至是超级用户,声称他们可以访问多个组织中的不同角色。

现在,让我们想象一下,我是用户admin登录到我的管理面板,我想为用户user授予组织管理员对组织管理员声明的组织发布者声明

为简单起见,我有一个看起来像这样的模型对象:

public class GrantRightModel
{
   public string OrganizationId { get; set; }
   public string UserId { get; set; }
   public string Right { get; set; }
}

并且出于本示例的目的,我们从admin用户获取以下值:

  • OrganizationId:admin具有组织管理员声明的组织的GUID。
  • UserId:user
  • 右:Organization-Publisher

有许多事情让我想起了这种做事方式。假设我们有一个带有GrantRight操作的OrgAdmin控制器;

  • 控制器操作是否需要检查当前登录的用户(使用例如ClaimsPrincipal.Current找到)是否具有GrantRightModel.OrganizationId"手动"的Organizaton-Admin声明,或者是否存在这种事情的聪明的auth属性?

  • 在代码中添加Organization-Publisher:{guid}声明到user的正确方法是什么?我的控制器将根据需要通过依赖注入获得UserManager。

  • 如果user在发生这种情况时已登录到应用程序,是否有办法让他在下次请求时自动获得正确的声明?我已经看到提到了这样做的方法,这会导致用户退出,这样他就可以再次登录并开始与他的新声明进行新的会话。我知道为什么会这样,但鉴于用户可能正在处理需要花费大量时间的事情,因此当他试图提交他的作品时,让他退出可能并不常见。

网上有一些关于此的信息,但是我的google-fu让我失去了找到如何击败这三点的那个。

任何?

谢谢!

1 个答案:

答案 0 :(得分:3)

注意你的问题。

  

控制器操作是否需要检查当前登录的用户(使用例如ClaimsPrincipal.Current找到)是否具有GrantRightModel.OrganizationId"手动"的Organizaton-Admin声明,或者是否有聪明的身份验证属性对于这种事情?

没有。 Authorize属性采用授权时检查的可选角色列表。如果其中一个角色声明指向该角色,则使用授权而不涉及自定义代码。

  

在代码中添加Organization-Publisher:{guid}声明给用户的正确方法是什么?我的控制器将根据需要通过依赖注入获得UserManager。

您使用适当的声明创建ClaimsIdentity,然后要求授权经理使用该身份登录。然后,身份通常会与声明一起保存在Cookie中。

  

如果用户在发生这种情况时登录了该应用程序,是否有办法让他从下一个请求开始自动获得正确的声明?我已经看到提到了这样做的方法,这会导致用户退出,这样他就可以再次登录并开始与他的新声明进行新的会话。我知道为什么会这样,但鉴于用户可能正在处理需要花费大量时间的事情,因此当他试图提交他的作品时,让他退出可能并不常见。

我已经阅读了两次并且没有完全理解它。当您发出cookie时,cookie负责保留经过身份验证的会话。然后,基于cookie,在每个请求管道中尽早重建声明。然后,用户可以发出许多请求,并且他仍然会登录"只要cookie未失效或存储在cookie中的身份验证令牌过期。