10

我需要在 MVC3 Web 应用程序中为 Forms 和 Windows 身份验证实现用户权限提升,但这个问题对于 Windows 身份验证至关重要。这是为了让较高权限的用户向较低权限的用户提供帮助,例如,当文书用户正在执行任务并要求管理员用户在文书用户可以继续之前执行任务时,管理员用户应该能够提升相同的会话到他们的权限级别,执行管理任务,并恢复会话的较低权限。考虑到我们只想在文书用户的桌面上实现这一点,我看不到没有文书用户注销和管理员用户登录的方法。也许用户切换比一个全新的会话更整洁,但我非常喜欢“运行方式”

这甚至可能吗?如果可以,我该如何实现?我什至不知道从哪里开始寻找。

4

4 回答 4

5

允许“高级用户”为其他用户临时设置特定角色,例如还可以使用 DateTime 设置角色到期。

于 2012-05-26T09:48:32.310 回答
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。

于 2012-06-29T08:46:52.193 回答
1

为了使用 Windows 身份验证来执行此操作,我认为您需要:

  • 作为命令运行
  • 用户桌面上用于启动其他登录的快捷方式
  • 提示用户登录信息的批处理脚本或收集信息的单独桌面程序(快捷方式指向您选择的任何一个)
  • 一旦run as命令行信息准备就绪,您就可以启动浏览器,也可以启动带有嵌入式浏览器的自定义程序。

该程序具有嵌入式浏览器方法的一个优点是它可以具有额外的安全预防措施,例如在超时后强制关闭自身。

无论如何,这是一种可能的解决方案。您还可以尝试提出一种不太复杂的方法来解决业务需求。也许是管理员的远程桌面会话?

于 2012-06-27T13:58:51.363 回答
1

run as 命令的等价物是使用用户模拟。那就是以另一个用户的身份运行需要更高权限的命令。它应该如下工作: 1)用户尝试访问特权资源。webapp 检测到这一点要么是因为它有一个需要更高权限的所有任务的表,要么是通过拦截它试图执行操作的安全异常。2)当检测到这种情况时,您会抛出“RequiresPrivilegesElevationException”(您必须定义的异常)。我被控制器捕获的这个异常,现在知道它必须提示用户提供更高的权限 3)控制器提示用户输入管理员(或更高权限的用户密码) 4)当用户发送 credentilas(通过 https)凭据时用于创建模拟上下文,

这种方法的缺点是凭据和特权提升仅持续一次到服务器的行程......对于任何其他请求,用户被迫重新插入凭据。由于安全浏览器的限制,没有安全的方法可以避免这种情况

于 2012-06-30T08:52:19.647 回答