2014-12-21 4 views
0

У меня есть приложение ASP.NET, которое использует олицетворение. Мои ConnectionStrings динамически генерируются с использованием EntityConnectionStringBuilder.Entity Framework Аутентификация Windows с олицетворением ASP.NET

Он отлично работает, когда я использую SQL Server Authentication, но когда я использую Windows Authentication от замены идентификатора пользователя и пароля с Trusted_Connection=Yes; я получаю сообщение об ошибке сказав «System.Data.SqlClient.SqlException (0x80131904): Не удается открыть базу данных» DB_Name "просил при входе в систему. Ошибка входа в систему. Ошибка входа в систему для пользователя 'DomainName\MachineName$' ".

Похоже, что Entity Framework использует встроенную учетную запись пользователя (MachineName$) вместо пользователя-олигарха 'DomainName\User1'.

Как настроить EF для использования подлинных пользователей для проверки подлинности Windows?

ответ

2

Вы не пользуетесь олицетворением. Если бы вы были, то это будет работать (при условии, что ваша база данных в противном случае была правильно настроена, чтобы разрешить доступ к олицетворенному пользователю).

EF не использует «встроенную» учетную запись. Он использует любую учетную запись, на которой работает рабочий процесс, который в большинстве случаев будет либо идентификатором пула приложений, либо сетевой службой, оба из которых используют учетную запись Active Directory компьютеров для учетных данных.

Другими словами, EF использует то, что строка подключения говорит ему использовать, и если вы говорите ему использовать доверенное соединение, то он использует все, что работает в процессе/потоке.

На самом деле олицетворение не поддерживается в IIS7 или выше при работе в режиме интегрированного конвейера. Причина этого в том, что IIS7 более тесно привязан к .NET и поддерживает асинхронные обработчики. Обработчики Asynch имеют проблемы с олицетворением, потому что поток, который начал обработчик, может быть не тем же потоком, который возобновляет обработчик, когда запрос async возобновляется после отказа от потока, чтобы выполнить работу async.

В целом, если у вас нет особого варианта использования, вы, вероятно, не должны проектировать свою архитектуру, чтобы требовать олицетворения, так как это имеет много последствий.

Если вам нужно использовать ресурс с определенным пользователем, то вы можете использовать принципал WindowsIdentity и олицетворять таким образом, но это нужно делать в рамках небольшого блока (самого сетевого вызова).

Я не уверен, как вы пытаетесь сделать олицетворение, но это явно не работает. В большинстве случаев вы должны получать сообщение об ошибке, если пытаетесь выдавать себя за IIS7 +, поэтому вопрос действительно ... Почему вы думаете, что используете олицетворение?

+0

Ваш ответ имеет для меня большой смысл. Я запускаю это приложение на «IIS 8.5», работающем на «Windows Server 2012 R2». У меня есть ' ' в моих 'web.config' и' System.Security.Principal. WindowsIdentity.GetCurrent(). Name' возвращает текущее имя пользователя. Он отображает «ApplicationPoolIdentity», если я удалю настройку. 'ApplicationPool' находится в' Интегрированном режиме', а Identity устанавливается как 'ApplicationPoolIdentity'. –

+0

@LibinTK - Это не имеет большого смысла, вы должны увидеть ошибку, такую ​​как: http://stackoverflow.com/questions/12966286/impersonate-domain-user-with-integrated-pipeline Это говорит мне, что у вас есть что-то неправильно сконфигурировано где-то .. вы уверены, что это в режиме интегрированного конвейера?Если вы не обошли это с помощью '', в этом случае вы не получите ошибку, но олицетворение просто не будет работать должным образом. –

+0

@LibinTK. Однако, поскольку вы задаете имя пользователя явно в файле web.config (в отличие от простого использования учетных данных пользователя вошедшего в систему пользователя), вместо этого вы должны использовать пул приложений в качестве этого пользователя. Измените идентификатор пулов приложений на нужное имя пользователя. Вы также не понимаете разницу между зарегистрированным пользователем и идентификатором пула приложений. EF работает с идентификатором текущего потока, который, как правило, является идентификатором пула приложений независимо от зарегистрированного пользователя. –

Смежные вопросы