7

我正在编写一个 Intranet 应用程序。project.json 中的目标框架是 dnx451。这是我的发布命令:

dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1-update1 --no-source

数据库连接字符串:

Server=name;Database=name;Trusted_Connection=True;

我正在尝试模拟数据库访问,但它不起作用。当我启动应用程序时,我的 Windows 用户被识别,并在右上角显示 Hello, Domain\Username。一旦我尝试访问数据库,我就会收到错误“用户域\计算机名登录失败”。如果我在我的用户下运行应用程序池,那么一切正常。

IIS:.NET CLR 版本是 v4.0,托管管道模式经典,身份是 ApplicationPoolIdentity。网站身份验证:启用 ASP.NET 模拟和 Windows 身份验证。

我需要什么来改变模拟最终起作用?

4

2 回答 2

8

Core 不支持模拟,因为所有 Web 代码都在由 Kestrel 托管的 proc 之外。如果你想这样做,你需要将当前的 Principal 作为一个 WindowsPrincipal,然后在你需要它的地方手动模拟。

需要注意的一点是,在 RC1 中您没有获得 WindowsPrincipal,因此您现在无法执行此操作。它将在 RC2 中修复。

于 2016-02-03T17:42:28.363 回答
8

如果你想让每个页面请求都冒充用户,你可以配置自己的中间件在MVC之前运行;

public class Impersonate
{
    private readonly RequestDelegate next;
    public Impersonate(RequestDelegate next) {
        this.next = next;
    }
    public async Task Invoke(HttpContext context) {
        var winIdent = context.User.Identity as WindowsIdentity;
        if (winIdent == null) {
            await next.Invoke(context);
        }else {
            WindowsIdentity.RunImpersonated(winIdent.AccessToken, () => {
                next.Invoke(context).Wait();
            });
        }
    }
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
    ....
    app.UseMiddleware<Impersonate>();
    app.UseMvc(...);
    ...
}
于 2016-10-07T02:06:12.953 回答