我需要在MVC3 Web应用程序中实现用户权限提升,对于Forms和Windows身份验证,但这个问题对于Windows身份验证至关重要。这适用于较高特权的用户,以向较低特权用户提供帮助,例如,当文书用户执行任务并且需要管理员用户在文书用户可以继续之前执行任务时,管理员用户应该能够将同一会话提升到他们的权限级别,执行管理任务,并恢复较低权限到会议。在没有文书用户注销和管理员用户登录的情况下,我没有看到这样的方法,因为我们希望仅在文书用户的桌面上实现这一点。也许用户切换比整个新会话更整洁,但我非常希望对Windows认证的网络应用程序进行“运行”等效。
这是否可能,如果是这样,我怎样才能做到这一点?我不知道从哪里开始寻找。
答案 0 :(得分:5)
允许“超级用户”临时为其他用户设置特定角色,例如使用DateTime设置角色的到期时间。
答案 1 :(得分:3)
你可以在你的网站上放置一个锚点:
@Html.ActionLink("elevate to admin", "SwitchToAdmin", "Home")
然后有一个控制器操作,允许输入管理员凭据:
public ActionResult SwitchToAdmin()
{
// TODO: Adjust the role name that your administrators will have
if (!User.IsInRole(@"DOMAIN\Administrators"))
{
// The user is not currently an admin => popup a Logon box
// so that the administrator could authenticate himself
return new HttpUnauthorizedResult();
}
else
{
// After inputting the correct username and password for the
// admin, we can now redirect to the home action and start performing
// the admin tasks
return RedirectToAction("index", "home");
}
}
恢复过程将是相反的。如果用户是管理员,允许普通用户输入他的用户名和密码,你可以拥有一个调用控制器动作的链接,该动作将抛出401.
答案 2 :(得分:1)
为了使用Windows身份验证执行此操作,我认为您需要:
run as
命令行的信息准备就绪,您就可以启动浏览器,也可以使用嵌入式浏览器启动自定义程序。 嵌入式浏览器方法的一个优点是它可以有额外的安全预防措施,例如在超时后强行关闭。
无论如何,这是一种可能的解决方案。您也可能尝试提出一种不太复杂的方法来解决业务需求。也许是管理员的远程桌面会话?
答案 3 :(得分:1)
run as命令的等价物是使用用户模拟。那就是运行需要更高权限的命令作为另一个用户。 它应该如下工作: 1)用户尝试访问特权资源。 webapp检测到这一点,因为它有一种所有任务重新获得更高权限的表,或者通过拦截它试图执行操作的安全异常。 2)当检测到这个时,你抛出一个“RequiresPrivilegesElevationException”(你必须定义一个例外)。我控制器捕获的这个异常,现在知道它必须提示用户获得更高的权限 3)控制器提示用户输入admin(或更高权限的用户密码) 4)当用户发送凭证(通过https)时,凭据用于创建模拟上下文,并且所有操作都在此模拟上下文中完成。
这种方法的缺点是凭证和权限要求仅持续一次到服务器...对于用户被迫重新插入凭证的任何其他请求。由于安全浏览器的限制,没有安全的方法来避免这种情况