Asp.net mvc 5 有什么好方法可以让普通用户隔离,但管理员用户可以访问相同的页面?

Asp.net mvc 5 有什么好方法可以让普通用户隔离,但管理员用户可以访问相同的页面?,asp.net-mvc-5,asp.net-identity,Asp.net Mvc 5,Asp.net Identity,我正在使用ASP.NETMVC5和ASP.NETIdentity。我有一个有多个用户的网站,他们应该只看到自己的数据。普通用户通过/orders、/orders/edit/1等URL访问该网站 我还有一些管理员用户,他们应该能够访问普通用户看到的所有内容,只是他们可以查看所有用户的数据。我想做的是允许他们模拟用户,并查看该用户看到的内容。因此,他们可能通过/user foo/orders、/user foo/orders/edit/1等URL访问该站点 目前,我的控制器有两种不同的操作:一种是管

我正在使用ASP.NETMVC5和ASP.NETIdentity。我有一个有多个用户的网站,他们应该只看到自己的数据。普通用户通过/orders、/orders/edit/1等URL访问该网站

我还有一些管理员用户,他们应该能够访问普通用户看到的所有内容,只是他们可以查看所有用户的数据。我想做的是允许他们模拟用户,并查看该用户看到的内容。因此,他们可能通过/user foo/orders、/user foo/orders/edit/1等URL访问该站点

目前,我的控制器有两种不同的操作:一种是管理员用户的用户id参数,另一种是普通用户的用户id参数。在后一种情况下,使用登录用户的id。然后,这两种方法都调用一些共享代码来呈现视图


但是,在呈现视图时,我需要确保任何嵌入的链接(例如到订单详细信息页面的链接)使用正确的路由表单(带/不带用户id)。这意味着我需要不断检查用户是否是管理员等。是否有更好的方法来实现这一点?

我通常为两者提供相同的结构,但如果我阻止某个角色类型的访问,则使用具有指定角色的Authorize属性。或者,您可以检查controllers User属性以查找登录的用户,并执行自己的逻辑以确定该用户有权查看哪些数据

我通常为这两者提供相同的结构,但如果我阻止某个角色类型的访问,则使用带有指定角色的Authorize属性。或者,您可以检查controllers User属性以查找登录的用户,并执行自己的逻辑以确定该用户有权查看哪些数据

我将使用ASP.NET Identity中提供的。只需为模拟用户ID添加声明,该声明仅在用户是管理员时使用。这些角色可能已经出现在声明中。您不需要传递ID的操作,而是添加一些逻辑来查看声明,以查看此人是否是管理员。如果他们是管理员,并且存在包含模拟ID的声明,则使用该声明而不是登录用户ID

这是一个例子。这显示了如何在登录过程中设置声明。如果您需要在登录过程之后添加声明,只需再次使用SignIn方法,如下所示

var AuthenticationManager = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var prinicpal = (ClaimsPrincipal)Thread.CurrentPrincipal;
prinicipal.AddClaim(new Claim(MyClaimTypes.ImpersonatedUserId, impersonatedUserId));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, principal);
我将使用ASP.NET Identity中提供的。只需为模拟用户ID添加声明,该声明仅在用户是管理员时使用。这些角色可能已经出现在声明中。您不需要传递ID的操作,而是添加一些逻辑来查看声明,以查看此人是否是管理员。如果他们是管理员,并且存在包含模拟ID的声明,则使用该声明而不是登录用户ID

这是一个例子。这显示了如何在登录过程中设置声明。如果您需要在登录过程之后添加声明,只需再次使用SignIn方法,如下所示

var AuthenticationManager = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var prinicpal = (ClaimsPrincipal)Thread.CurrentPrincipal;
prinicipal.AddClaim(new Claim(MyClaimTypes.ImpersonatedUserId, impersonatedUserId));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, principal);

谢谢,我也在使用[AuthorizeRoles=x,y]来阻止对使用用户ID的控制器操作的访问。而且我在访问数据时没有遇到问题——这是双路由让我头疼。你说你对这两者都使用相同的结构,但是,您肯定需要在管理员版本的URL中包含用户ID,因为它不能从登录的用户ID中暗示出来。我真的不想在面向客户端的URL中包含用户ID,因为ASP.NET标识用户ID是一个巨大的乱七八糟的字符串…请注意使用Identity 2.0.0的此评论的未来读者,您现在可以将Identity配置为对用户ID使用整数,而不是GUI。这并不能真正回答最初的问题,但可能会让事情变得更糟。。。适口的如果这原本是可能的话!谢谢,我也在使用[AuthorizeRoles=x,y]来阻止对使用用户ID的控制器操作的访问。而且我在访问数据时没有遇到问题——这是双路由让我头疼。你说你对这两者都使用相同的结构,但是,您肯定需要在管理员版本的URL中包含用户ID,因为它不能从登录的用户ID中暗示出来。我真的不想在面向客户端的URL中包含用户ID,因为ASP.NET标识用户ID是一个巨大的乱七八糟的字符串…请注意使用Identity 2.0.0的此评论的未来读者,您现在可以将Identity配置为对用户ID使用整数,而不是GUI。这并不能真正回答最初的问题,但可能会让事情变得更糟。。。适口的如果这原本是可能的话!听起来很完美,我很高兴我问了这个问题。然而,我找不到任何关于如何实际使用这些东西的信息。所有关于索赔的描述都是如此抽象,以至于完全无法理解。我还没有看到任何示例代码。。。不过,谢谢,看来该走了,所以我会努力的
嗯。。。我还没有找到任何有用的例子,但这让我感到震惊——添加声明说某个特定用户正在被模拟,与在会话中简单地粘贴某个内容说相同的话有什么区别吗?在这两种情况下,我都可以按照你的建议在行动中简单地检查一下。。。使用声明有什么好处?声明与用户的身份相关,因此是一种更具凝聚力的设计。此外,您还可以使用联合身份验证将此信息持久保存在cookie或令牌中,这些cookie或令牌可以跨应用程序域或在服务器场环境中使用。通过使用会话,您可能可以获得类似的结果,但出于所述原因,我喜欢声明。下面是我写的一篇关于如何从声明中获取角色的文章[.我将不得不测试添加声明是否适用于ASP.NET Identity,因为MVC 5和OWIN的安全管道已发生重大变化。我将发布我的发现。我更新了答案,加入了关于如何在ASP.NET Identity中使用声明的参考。这听起来很完美,我很高兴我问了这个问题。但是,我找不到有关如何在ASP.NET Identity中使用声明的任何信息ally使用这些东西。所有声明的描述都是如此抽象,以至于它们完全无法理解。我还没有看到任何示例代码…但谢谢,这看起来是一条路要走,所以我会深入研究。嗯…还没有找到任何有用的示例,但让我震惊的是-添加声明说明特定用途之间有什么区别吗r是被模拟的,只是在会话中粘贴一些东西说同样的话?在这两种情况下,我可以按照您的建议在操作中简单地检查这一点…使用声明有什么好处?声明与用户的身份相关,因此是您尝试做的事情的更具凝聚力的设计。您也可以使用federated身份验证将此信息持久保存在可跨应用程序域或服务器场环境使用的cookie或令牌中。通过使用会话,您可能可以获得类似的结果,但出于所述原因,我喜欢声明。以下是我写的一篇文章,介绍如何从声明中获取角色[.由于MVC 5和OWIN的安全管道发生了重大变化,我必须测试添加声明是否适用于ASP.NET Identity。我将发布我的发现。我更新了我的答案,以包括如何在ASP.NET Identity中使用声明的参考。