Возможно, я не понимаю вопрос, но:
Для подключения к серверу SQL с использованием проверки подлинности Windows строка подключения должна использовать «Integrated Security», что означает, что он будет использовать текущий контекст безопасности, который создает соединение. Обычно это будет ваш пользователь AppPool, который в вашем случае является учетной записью службы. Насколько я знаю, вы не можете автоматически передавать свое олицетворение в поток AppPool, используя Kerberos auth . Вот цитата, которую я нашел:
В IIS только базовая аутентификация регистрирует пользователей с маркером безопасности, который проходит по сети на удаленный SQL-сервер. По умолчанию другие режимы безопасности IIS, используемые в сочетании с параметрами элемента конфигурации идентификации, не приведут к появлению маркера, который может аутентифицироваться на удаленном SQL Server.
Поэтому, если вы хотите олицетворять других пользователей, вам нужно будет начать новую тему под руководством пользователя, который вы выдаете себя за себя. Таким образом, соединение Integrated Security будет использовать Windows Auth этого пользователя для подключения к SQL Server.
Я точно не знаю, как это сделать, но вот что-то, что может подтолкнуть вас в правильном направлении:
public void NewThreadToRunSQLQueries(object claimsIdentity) {
if (claimsIdentity as ClaimsIdentity == null) {
throw new ArgumentNullException("claimsIdentity");
}
ClaimsIdentity claimsIdentity = (ClaimsIdentity)claimsIdentity;
var claimsIdentitylst = new ClaimsIdentityCollection(new List<IClaimsIdentity> { claimsIdentity });
IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentitylst);
Thread.CurrentPrincipal = claimsPrincipal; //Set current thread principal
using(SqlConnection connection = new SqlConnection("Server=myServerAddress;Database=myDataBase;Integrated Security=True;"))
{
connection.Open(); //Open connection under impersonated user account
//Run SQL Queries
}
}
Thread thread = new Thread(NewThreadToRunSQLQueries);
thread.Start(_identity);
Редактировать:
Что касается вашего комментария о том, как сделать эту структуру «глобальной», предполагая, что у вас есть доступ к HttpContext в вашем обработчике проверки подлинности, вы можете сделать это:
var principal = new ClaimsPrincipal(_identity);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
Поэтому теоретически рабочий поток из IIS должен теперь запускаться под аутентифицированным пользователем (олицетворение). И надежные подключения к SQL Server должны быть возможны. Я говорю теоретически, потому что сам не пробовал. Но в худшем случае вы могли бы получить претензию от HttpContext, чтобы начать отдельный поток, как в моем примере выше. Но если это работает само по себе, вам даже не придется начинать новый поток, как я изначально упоминал.