在asp.net core中模拟用户

2024-03-01

我有来自常规 mvc 应用程序的以下代码,它通过模拟用户上传文件

 public class PublicController : Controller
 {
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;
    WindowsImpersonationContext impersonationContext;
    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);
    

    public SomeActionMethod(model containing file)
    {
       if (ImpersonateValidUser(userName: "someuserwithpowertoupload", domain: "", password: "somepassword"))
       {
        path = "Somepath";
        file.SaveAs(path);
       }
    }


 private bool ImpersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;
        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, impersonationLevel: 2, hNewToken: ref tokenDuplicate) != 0)
                {
                    using (tempWindowsIdentity = new WindowsIdentity(tokenDuplicate))
                    {
                        this.impersonationContext = tempWindowsIdentity.Impersonate();
                        if (this.impersonationContext != null)
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return true;
                        }
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
        {
            CloseHandle(token);
        }
        if (tokenDuplicate != IntPtr.Zero)
        {
            CloseHandle(tokenDuplicate);
        }
        return false;
    }

这里的问题是 WindowsImpersonationContext 在 .net core 中不存在。任何人都可以提供模拟用户的代码片段吗?微软文档在这里https://learn.microsoft.com/en-us/dotnet/standard/security/impersonating-and-reverting https://learn.microsoft.com/en-us/dotnet/standard/security/impersonating-and-reverting不是很有帮助。

谢谢。


:

ASP.NET Core 不实现模拟。应用程序针对所有请求以应用程序的身份运行,使用应用程序池或进程身份。如果应用程序应代表用户执行操作,请使用WindowsIdentity.RunImpersonated or RunImpersonatedAsync在终端内联中间件中Startup.Configure.

app.Run(async (context) =>
{
    try
    {
        var user = (WindowsIdentity)context.User.Identity;

        await context.Response
            .WriteAsync($"User: {user.Name}\tState: {user.ImpersonationLevel}\n");

        WindowsIdentity.RunImpersonated(user.AccessToken, () =>
        {
            var impersonatedUser = WindowsIdentity.GetCurrent();
            var message =
                $"User: {impersonatedUser.Name}\t" +
                $"State: {impersonatedUser.ImpersonationLevel}";

            var bytes = Encoding.UTF8.GetBytes(message);
            context.Response.Body.Write(bytes, 0, bytes.Length);
        });
    }
    catch (Exception e)
    {
        await context.Response.WriteAsync(e.ToString());
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在asp.net core中模拟用户 的相关文章

随机推荐

  • 将库添加到级联中

    您好 我正在开发一个应用程序来解压 blackberry10 中的文件 为了解压缩文件 我使用从 github 获得的 quazip 库代码 但我不知道如何将此库添加到我的项目中 任何人都可以让我知道如何将库添加到黑莓级联中 要将库添加到
  • Pandas 发送包含数据框作为可视表的电子邮件

    举个例子 df 1 1 2 3 5 df 2 10 20 30 50 df test pd concat pd DataFrame df 1 pd DataFrame df 2 axis 1 我如何通过 gmail 发送电子邮件 并使用此数
  • 值元组从 WebAPI 暴露错误的参数名称

    我正在使用网络 API 我有点懒 决定从我的控制器返回一个值元组 HttpGet Route AuthAPIRoutes GET MFA DEVICES public string Type string Value GetMultiFac
  • 是否可以使用 INNO 脚本移动现有目录/文件?

    我们最近对一个使用 INNO 脚本安装的应用程序进行了重大重组 不幸的是 该应用程序需要某些文件在不同版本之间保持不变 更不幸的是 这些文件的位置在这次重组期间发生了变化 最不幸的是 现在由我来制作一个 INNO 脚本片段 它将查看这些文件
  • swift 中的方法数组,没有引用循环

    我的目标是创建一个包含数组的类 数组的元素将是同一类的方法 喜欢 class MyClass lazy var functions self myFirstMethod self mySecondMethod deinit print De
  • 将 browser.element 获取到具有子项的页面对象中

    当我派生一个驱动程序实例以在浏览器之间发送消息时 我正在进行测试 我还使用页面对象来映射视图 在我的页面对象中 我有其他页面对象 其中一些对象继承自另一个页面对象 但是 当我分叉了一个驱动程序实例并有两个浏览器可以使用时 获取element
  • apache poi XSSFClientAnchor 未相对于 dx1、dy1、dx2、dy2 定位图片

    我正在尝试使用添加图像到Excelapache poi 版本3 16 我能够做到这一点HSSFWorkbook and XSSFWorkbook 但是当我尝试为图像添加间距时 即如果我设置dx1 dy1 dx2 dy2坐标在XSSFClie
  • Redis / Node.js - 2 个客户端(1 个发布/订阅)导致写入问题

    尝试创建两个客户端 一种是发布 订阅 另一种是标准连接 这不可能吗 必须有一种方法可以将其抽象为工作 基本上 如果我做一个get key运行 test js 后 我看到的只是 valueBefore 输出 node test js Repl
  • 地理编码地址 - 获取某个地址的区域(Google API)

    我有一个包含确切地址的数据库 街道 号码 城市 地区 地区 国家 但是 我想知道如果我们在纽约 是否有办法使用 Google API 来获取城市的区 例如 曼哈顿 所有其他信息我都已经在数据库中了 所以我只需要该地区 如果有的话 当然这只会
  • WPF自定义控件的ToolTip MultiBinding问题

    当我在 WPF 自定义控件中设置 ToolTip 绑定时 这种方式效果完美 public override void OnApplyTemplate base OnApplyTemplate SetBinding ToolTipProper
  • sbt-idea 1.2.0 未解决 SBT 0.12.0 和 Scala 2.10.0 问题?

    我正在创建一个新的 SBT 项目 以下是我的 SBT 文件的内容 构建属性 sbt version 0 12 0 插件 sbt addSbtPlugin com github mpeltonen sbt idea 1 2 0 构建 sbt
  • Java 字节码 DUP

    我想知道为什么以下字节码中的异常 用于抛出异常 是重复的 NEW java lang IllegalArgumentException DUP INVOKESPECIAL java lang IllegalArgumentException
  • PySpark 中的微秒时间戳

    我正在尝试使用 pyspark 中的以下语法将微秒字符串转换为时间戳 然而 我似乎得到了null当我转换时 我正在使用 Spark 2 2 我的字符串看起来像20180503 07 05 00 008288 我正在使用以下代码转换为时间戳
  • Azure Active Directory 应用程序权限更改延迟

    我正在使用 Azure Active Directory 为我的应用程序提供对 Microsoft Graph API 的访问权限 当我进行权限更改 例如 对各种类型数据的读 写访问权限 时 我注意到从保存更改到我能够通过 API 访问新数
  • 在 RSpec 中存根 RestClient 响应

    我有以下规格 describe successful POST on user create do it should redirect to dashboard do post user create name gt dave email
  • 在带有 npm 的 Lambda 函数中使用 AWS Cognito

    我正在尝试在 Lambda 函数中使用 AWS Cognito 来授权用户 我有一些来自 Udemy 课程的示例代码 不再可用 https www udemy com minimum viable aws cognito user auth
  • 使用 javascript 测试多屏幕

    是否可以判断网站的用户是否使用多个显示器 我需要找到弹出窗口的位置 但用户很可能有多个显示器设置 同时window screenX等将给出浏览器窗口的位置 这对于多个显示器来说是无用的 我在 StackOverflow 上的任何地方都没有找
  • 如何在 iPhone 上记录 SQLite 查询

    我正在开发一个 iPhone 应用程序 并且使用 SQLite 问题是我的查询有一些问题 我做了错误的绑定 所以 这是我的问题 如何使用 SQLite 接收的绑定在我的 iPhone 应用程序中登录有效的 SQL 查询 语句 Thanks
  • 2 个以上线程写入/读取变量的真正危险

    同时读 写单个变量的真正危险是什么 如果我使用一个线程写入一个变量 另一个线程在 while 循环中读取该变量 并且在写入变量时读取该变量并且使用旧值 则不会有危险 这里还有什么危险 同时读 写是否会导致线程崩溃 或者当发生精确的同时读 写
  • 在asp.net core中模拟用户

    我有来自常规 mvc 应用程序的以下代码 它通过模拟用户上传文件 public class PublicController Controller public const int LOGON32 LOGON INTERACTIVE 2 p