ASP.NET CORE 1.0,模拟登录

6

我正在编写一款内部网络应用程序。项目中的目标框架是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”。但是,一旦我尝试访问数据库,就会出现“User Domain\Computername登录失败”的错误。如果我以我的用户身份运行应用程序池,则一切正常。
IIS: .NET CLR版本为v4.0,托管管道模式为Classic,标识为ApplicationPoolIdentity。 网站验证:启用了ASP.NET模拟和Windows身份验证。
我需要更改什么以使模拟最终起作用?
2个回答

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(...);
    ...
}

1
那段代码在最新的稳定核心MVC上美丽地失败了 =( - Andrii Horda
1
抱歉,我错误地尝试异步调用下一个处理程序,这意味着模拟可能仅适用于第一个等待的 I/O 调用。然后将返回异步任务,RunImpersonated 将返回,并且我们将等待 Web 管道的其余部分。相反,模拟必须阻塞请求线程,直到下一个委托完成(如上所述编辑)?虽然仍可能有在不同线程上运行的异步代码... - Jeremy Lakeman

8

Core不支持模拟身份,因为所有的Web代码都是由Kestrel托管的。如果你想要这样做,你需要将当前的Principal作为WindowsPrincipal,然后在需要的地方手动进行模拟身份

需要注意的是,在RC1中,你无法获得WindowsPrincipal,所以现在无法执行此操作。这个问题将在RC2中得到解决。


blowdart的解决方案可行,我刚在RC1上测试过。我使用了一个针对4.5.1的更新版本:http://impersonation.codeplex.com/,我相信它源自同样存在已久的MSDN示例。 - b.pell
@blowdart:如果我只针对dnx-clr目标,它是否仍然是核心? - Dani
@blowdar:有没有RC2的beta版,我可以获取WindowsPrincipal? - Dani
@Dani不是的。只有在夜间版本中才有。 - blowdart
@blowdart,由于RC2现在已经发布,您能否更新您的答案? - Ivan Prodanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接