You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Core代码中关闭Impersonation 求相关实现示例

.NET Core 3.1 关闭Impersonation(身份模拟)的实现方案

场景1:IIS 托管场景

IIS托管场景下默认如果开启了Windows身份验证,会默认启用身份模拟,可按以下步骤关闭:

  • 修改项目根目录的web.config文件,在aspNetCore节点添加forwardWindowsAuthToken="false"属性,完整配置示例:
<system.webServer>
  <aspNetCore processPath="dotnet" arguments=".\你的项目名.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" hostingModel="inprocess" />
</system.webServer>
  • 同步在IIS站点的「身份验证」设置中,将「ASP.NET模拟」选项调整为禁用状态
  • 代码层面修改Startup.cs的ConfigureServices方法,移除模拟相关的服务注册:
public void ConfigureServices(IServiceCollection services)
{
    // 移除/不要添加以下会启用身份模拟的配置
    // services.AddAuthentication(IISDefaults.AuthenticationScheme);
    // 不要注册任何带Impersonation标识的中间件服务

    // 其余业务服务配置保留
    services.AddControllersWithViews();
}

场景2:Kestrel 自托管场景

Kestrel默认不会自动启用身份模拟,如果之前手动开启了相关逻辑,直接移除对应代码即可:

  • 不需要Windows身份验证的场景,直接删除Program.cs中HttpSys的Windows认证配置:
// 移除以下代码块
// .UseHttpSys(options =>
// {
//     options.Authentication.Schemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM;
//     options.Authentication.AllowAnonymous = false;
// })
  • 需要保留Windows身份验证但关闭模拟的场景,直接删除业务代码中调用WindowsIdentity.RunImpersonated的逻辑即可,无需额外配置:
// 移除以下模拟执行的代码
// var user = HttpContext.User.Identity as WindowsIdentity;
// WindowsIdentity.RunImpersonated(user.AccessToken, () =>
// {
//     // 模拟访问用户身份执行的业务逻辑
// });

生效验证

可以新增测试接口输出当前进程的运行身份,确认模拟已关闭:

[HttpGet("check-identity")]
public IActionResult CheckIdentity()
{
    var runUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    return Ok($"当前程序运行身份:{runUser}");
}

如果接口返回的身份为程序启动时的运行身份,而非访问用户的Windows身份,说明Impersonation已经成功关闭。

内容的提问来源于stack exchange,提问作者user3560831

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:04