Ядро ASP.net выдало себя за пользователя - не удалось загрузить файл или сборку Dapper - PullRequest
0 голосов
/ 08 июля 2019

Я надеюсь, что кто-то может указать мне правильное направление для этого. Я застрял на нем больше суток.

Цель

Я хочу разрешить моему 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");
        }
    }
}

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

Спасибо, что нашли время, чтобы прочитать это!

...