如何使用 ASP.NET Identity 2.0 允许用户模拟另一个用户?

2023-12-05

我正在将 ASP.NET MVC 5.1 应用程序从 MembershipProvider 迁移到 ASP.NET Identity v2.0。该应用程序的功能之一是用户模拟:管理员可以像在网站上注册的任何其他用户一样登录,而无需知道密码。

我用这段代码为 MembershipProvider 实现用户模拟这不适用于身份库。

如何在 ASP.NET Identity 中实现用户模拟(不是 IIS 模拟)?


我找到了解决这个问题的办法。

基本上,我使用管理员用户名添加声明,如果此声明存在,我就知道正在发生冒充行为。当管理员想要停止模拟时,系统会检索声明的原始用户名,删除旧的模拟 cookie 并为管理员创建一个新的 cookie:

[AuthenticateAdmin] // <- make sure this endpoint is only available to admins
public async Task ImpersonateUserAsync(string userName)
{
    var context = HttpContext.Current;

    var originalUsername = context.User.Identity.Name;

    var impersonatedUser = await userManager.FindByNameAsync(userName);

    var impersonatedIdentity = await userManager.CreateIdentityAsync(impersonatedUser, DefaultAuthenticationTypes.ApplicationCookie);
    impersonatedIdentity.AddClaim(new Claim("UserImpersonation", "true"));
    impersonatedIdentity.AddClaim(new Claim("OriginalUsername", originalUsername));

    var authenticationManager = context.GetOwinContext().Authentication;
    authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, impersonatedIdentity);
}

更多信息请参阅我的博文:使用 ASP.Net Identity 2 模拟用户.

Asp.Net Core 中的用户模拟

2017 年 7 月更新:这个主题非常流行,所以我研究了 Core 中的用户模拟,原理与更新的 API 非常相似。模仿方法如下:

    [Authorize(Roles = "Admin")] // <-- Make sure only admins can access this 
    public async Task<IActionResult> ImpersonateUser(String userId)
    {
        var currentUserId = User.GetUserId();

        var impersonatedUser = await _userManager.FindByIdAsync(userId);

        var userPrincipal = await _signInManager.CreateUserPrincipalAsync(impersonatedUser);

        userPrincipal.Identities.First().AddClaim(new Claim("OriginalUserId", currentUserId));
        userPrincipal.Identities.First().AddClaim(new Claim("IsImpersonating", "true"));

        // sign out the current user
        await _signInManager.SignOutAsync();

        // If you use asp.net core 1.0
        await HttpContext.Authentication.SignInAsync(cookieOptions.ApplicationCookieAuthenticationScheme, userPrincipal);
        // If you use asp.net core 2.0 (the line above is deprecated)
        await HttpContext.SignInAsync(cookieOptions.ApplicationCookieAuthenticationScheme, userPrincipal);

        return RedirectToAction("Index", "Home");
    }

这是阻止冒充的方法:

    [Authorize(Roles = "Admin")] // <-- Make sure only admins can access this 
    public async Task<IActionResult> StopImpersonation()
    {
        if (!User.IsImpersonating())
        {
            throw new Exception("You are not impersonating now. Can't stop impersonation");
        }

        var originalUserId = User.FindFirst("OriginalUserId").Value;

        var originalUser = await _userManager.FindByIdAsync(originalUserId);

        await _signInManager.SignOutAsync();

        await _signInManager.SignInAsync(originalUser, isPersistent: true);

        return RedirectToAction("Index", "Home");
    }

完整解释在我的博客中:http://tech.trailmax.info/2017/07/user-impersonation-in-asp-net-core/GitHub 上的完整代码示例:https://github.com/trailmax/AspNetCoreImpersonation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ASP.NET Identity 2.0 允许用户模拟另一个用户? 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • ASP Identity CoreGeneratePasswordResetTokenAsync 已过期

    我已经在 NET Core 2 1 中设置了一个 Identity Server 4 项目 一切正常 但是当我使用用户管理器生成重置密码令牌时 令牌在 24 小时后过期 我可以将其更改为 48 小时吗 我发送重置令牌的代码如下所示 var
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • 打印大型 Swing 组件

    我有一个 Swing 表单 其中有一个 JScrollPane 内的自定义表格 它只是一个 JPanel 而不是 JTable 子类 我正在尝试打印它 如果我只是将整个框架发送到打印机 滚动窗格就会被切断 并且如果我将框架的大小调整为滚动窗
  • DependencyProperty 作为实例变量?

    虽然网络上的大多数代码示例都使用依赖属性的静态声明 但我发现在某些情况下它们被定义为公共只读实例成员 将 DependencyProperty 定义为实例成员 而不是静态 有什么优点吗 Note 我不想讨论静态成员是好还是坏的问题 更具体地
  • 维基百科 API 是否支持 CORS 还是仅支持 JSONP?

    这个问题涉及到另一个问题 这是一年前问过的 作者询问如何使用 JavaScript 和 Wikipedia API 发出跨域请求 一条评论是 en wikipedia org 似乎不允许 CORS 建议他改用 JSONP 我知道我可以使用
  • 动态更新fabric.js路径点

    我正在尝试动态地将点添加到路径对象 当我这样做时 路径会正确渲染 但边界矩形永远不会更新 这使得用户几乎不可能在画布上选择和移动路径 正如您在下面的代码中看到的 路径最初是使用单个点创建的 然后我动态添加第二个点以及控制点 执行此操作后 边
  • 如何使用 Apache POI 将 docx 中的文本(标签)替换为 HTML?

    我们将有一些模板 docx 文件 其中会有一些标签 例如 content 我需要用 HTML 替换这个标签 为此 我想在 XWPFDocument 中使用 altChunk 元素 以下答案在如何使用 Apache POI 将 altChun
  • 使用逗号格式化数字字符串

    我想格式化数字 我见过一些在数字字符串中插入逗号的正则表达式示例 都是连续检查3位数字 然后在数字中插入逗号 但我想要这样的东西 122 as 122 1234 as 1 234 12345 as 12 345 1723456 as 17
  • C 匹配组中的正则表达式

    我一直在努力解决 C 中的正则表达式 只是 usr include regex h 我有 比方说 数百个正则表达式 其中之一可以匹配输入字符串 目前我正在这样做 实际上生成它 如下所示 数百个 do while 内部有匹配 如果不匹配则中断
  • Hibernate多对多,重复相同的记录

    我尝试使用注释进行 Hibernate 映射多对多 并使用 vaannila 中给出的示例 http www vaannila com hibernate hibernate example hibernate mapping many t
  • 更新另一个视图上的标签

    我有两个视图 其中一个带有标签 在第二个视图上 有一个按钮 我想在这里实现的是能够按下按钮并更新第一个视图上的标签 我怎么做 我无法从第二个视图访问 IBOutlet 我必须对 IBOutlet 做些什么才能将其公开等吗 您可以使用NSNo
  • 如何在C#中的dll中进行全局异常处理?

    Dll 在 C 中没有入口点 因此我需要将全局异常处理的代码放在一处 因为这些 dll 在 exe 中引用 并且所有 dll 都有 try catch 但存在一些错误 导致它崩溃并识别我们正在尝试创建故障转储 任何人都可以建议这是可行的解决
  • 使用 HttpClient 发布自定义类型

    我有一个自定义 dto 类 public class myObject public string Id get set public string Name get set 和使用 Web Api 的控制器 4 5 net 框架 Http
  • 如何在 C 函数内使用全局结构引用填充结构指针?

    我是 C 新手 无法理解为什么 my struct ptr main 在下面的示例中为零 如何将 my structs 数组中结构的地址分配给 get my struct by name 函数中的 my struct ptr 指针 stru
  • Python 中根据条件求和嵌套列表

    我有一个嵌套列表 如下所示 Vienna 2012 890 503 70 London 2014 5400 879 78 London 2014 4800 70 90 Bern 2013 300 450 678 Vienna 2013 70
  • 将节点排列在特定位置

    在下面的 vis network 中 我有 2 组节点 我通过在生成一个节点后访问节点位置将 2 组节点分为左侧和右侧layout as tree 然后使用visEvents在节点组周围画了一个椭圆 以显示更定义为 2 个单元结构的分离 我
  • 如何向我的应用程序实时获取路线详细信息

    我正在为我的年终项目做一个 arduino 项目 我正在为自行车骑手制作一款智能手套 它可以通知电话 健康跟踪 地理跟踪和导航 我想知道是否有任何方法可以获取有关逐向导航到我的应用程序的详细信息 即 如果谷歌导航说 左转 则获取该详细信息并
  • 使用 Android Beam(或 S-Beam)发送大文件

    我的任务是为一个应用程序添加支持 以便通过 Android 上的 NFC 在设备之间传输大型数据文件 数十兆字节 我知道 Android 上的真正 NFC 速度非常慢 但我知道 ICS 支持将批量数据传输移交给蓝牙 三星拥有一种专有机制 可
  • java.lang.IllegalArgumentException:已添加:Lcom/google/android/gms/iid/MessengerCompat

    So I ve searched a lot on the internet already on what the error is causing me and they are all saying that a library ha
  • 在 64 位操作系统上的 32 位应用程序池中运行我的网站

    这是我的设置 开发 Windows Server 2008 64 位 视觉工作室 2008 具有 3 个类库 1 个 Web 应用程序的解决方案 暂存网络服务器 Windows Server 2008 R2 64 位 IIS7 5集成应用程
  • 如何检查输入字符串是否包含大写和小写组合?

    我想知道如何检查输入字符串是否包含大写和小写组合 之后打印一条语句以显示输入字符串包含大写和小写的组合 第0步 你需要的变量 char str int i char found lower found upper 第一步 遍历字符串 for
  • 如何使用 ASP.NET Identity 2.0 允许用户模拟另一个用户?

    我正在将 ASP NET MVC 5 1 应用程序从 MembershipProvider 迁移到 ASP NET Identity v2 0 该应用程序的功能之一是用户模拟 管理员可以像在网站上注册的任何其他用户一样登录 而无需知道密码