2016-02-03 4 views
7

Я пишу приложение Intranet. Целевая структура в project.json - dnx451. Это моя команда публикации:ASP.NET CORE 1.0, олицетворение

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 в правом верхнем углу. Как только я попытаюсь получить доступ к базе данных, я получаю сообщение об ошибке «Ошибка входа в домен для пользователя Domain \ Computername». Если я запускаю пул приложений под моим пользователем, тогда все работает нормально.

IIS: . NET CLR Versio - версия 4.0, управляемый режим работы в виде контура и идентификация - это ApplicationPoolIdentity. Аутентификация сайта: олицетворение ASP.NET и аутентификация Windows включены.

Что мне нужно для изменения этого олицетворения, наконец, работает?

ответ

7

Ядро не поддерживает олицетворение, потому что все веб-коды не обработаны, размещены Kestrel. Если вы хотите это сделать, вам нужно взять текущего Принципала, как WindowsPrincipal, затем manually impersonate в том месте, где оно вам нужно.

Следует отметить, что в RC1 вы не получаете WindowsPrincipal, поэтому вы не можете сделать это прямо сейчас. Это будет исправлено в RC2.

+0

решение blowdart будет работать, я просто проверил его против RC1. Я использовал обновленную версию этой версии, которая была нацелена на 4.5.1: http://impersonation.codeplex.com/, которая, как мне кажется, возникла из того же примера MSDN, который был вокруг какое-то время. –

+0

@blowdart: Является ли он еще основным, даже если я нацелен только на dnx-clr? – Dani

+0

Да, это все еще ядро ​​ – blowdart

7

Если вы хотите, чтобы каждый запрос страницы выдавал себя за пользователя, вы можете настроить свой собственный Middleware для запуска до 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 = ( –

+1

Извинения, я ошибочно пытался асинхронно вызывать следующий обработчик, что означало, что олицетворение, вероятно, было применено только к первому ожидаемому вызову ввода-вывода. Тогда задача async будет возвращен, RunImpersonate вернется, и мы подождем остальную часть веб-конвейера. Вместо этого олицетворение должно блокировать поток запроса до завершения следующего делегата (как отредактировано выше?). Хотя может быть и асинхронный код, который выполняется на другой поток ... –