如何在.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
相关产品推荐
相关产品推荐

