Я надеюсь, что кто-то может указать мне правильное направление для этого. Я застрял на нем больше суток.
Цель
Я хочу разрешить моему API выполнять запросы SQL от имени другого пользователя, нежели тот, который назначен пулу API.
В идеале я бы также хотел не требовать пароль пользователя (я не совсем уверен, возможно ли это, но олицетворение, кажется, является действительным при текущем способе, которым я это делаю)
Задача
Я пробовал несколько разных методов для получения ClaimsIdentity и вызова WindowsIdentity.RunImpersonated
, и, кажется, он работает нормально, пока я не попытаюсь получить доступ к базе данных SQL с помощью dapper. Я получаю следующее исключение Could not load file or assembly 'Dapper, Version=1.60.0.0, Culture=neutral, PublicKeyToken=null'. Exception from HRESULT: 0x80070542
.
Мой код выглядит следующим образом (я знаю, что он ни в коем случае не безопасен. Я просто хочу собрать подтверждение концепции перед тем, как продолжить работу над этим проектом)
[HttpGet]
public ActionResult<IEnumerable<string>> Get( [FromServices] IDomainService service)
{
string identity = "someuser@MYDOMAIN.COM";
WindowsIdentity wi = new WindowsIdentity(identity);
IEnumerable<string> result = new List<string>();
WindowsIdentity.RunImpersonated( wi.AccessToken, () => {
service.TestCall();
});
return Ok(result);
}
* * Service.TestCall тысячи двадцать-одина ()
public IEnumerable<string> TestCall()
{
return repository.TestQuery();
}
И, наконец, хранилище
public class TestRepository : ITestRepository
{
private string connectionString;
private IDbConnection Connection
{
get
{
return new SqlConnection(connectionString);
}
}
public TestRepository(string connectionString)
{
this.connectionString = connectionString;
}
public IEnumerable<string> TestQuery()
{
using(var connection = Connection)
{
return connection.Query<string>(@"SELECT TOP 1000 TestField From TestTable");
}
}
}
Если бы кто-нибудь мог дать некоторое представление о том, почему это не работает, я был бы вечно благодарен. Я предполагаю, что это связано с разрешениями или что олицетворение не выполняется должным образом.
Спасибо, что нашли время, чтобы прочитать это!