Я работаю в большой компании с интранетом и логинами Windows AD для всех. У нас есть несколько внутренних баз данных SQL Server, которые позволяют нам входить в систему с использованием аутентификации Windows, к одной из которых я пытаюсь подключиться через приложение ASP.NET Core. Я могу подключиться к этой базе данных через SQL Server Management Studio и нормально запросить таблицы.
Я следовал руководству для приложения ASP.NET Core, используя существующую базу данных настолько близко, насколько это возможно, и создал один класс модели для тестирования, чтобы увидеть, могу ли я читать данные из база данных. При отладке с помощью IIS Express в Visual Studio я могу читать данные из базы данных при доступе к автоматически сгенерированному контроллеру и представлениям.
Все выглядит нормально при отладке, но при публикации в IIS я получаю следующую ошибку:
SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.
Где домен - это мой домен, а имя компьютера - это имя моего компьютера. Это ожидается, так как сам мой компьютер не имеет доступа к базе данных. Но он не должен пытаться подключиться с помощью этой системной учетной записи (со знаком доллара), он должен пытаться соединиться с моей учетной записью Windows: <DOMAIN>\<USERNAME>
.
Что страннее, приложение делает , кажется, в какой-то мере распознает мои учетные данные Windows - когда я захожу на домашнюю страницу, я получаю знакомое сообщение "Hello, <DOMAIN>\<USERNAME>!"
в навигационной панели. Таким образом, учетные данные Windows определенно передаются приложению, но по некоторым причинам не передаются при попытке подключиться к базе данных через DbContext.
Я что-то упускаю здесь очевидное?
Мой код
Я начал с шаблона базового веб-приложения ASP.NET для Visual Studio.
В файле launchSettings.json у меня есть:
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:60686",
"sslPort": 44336
}
},
В appsettings.json у меня есть:
"ConnectionStrings": {
"MyDB": "Server=<servername>;Database=<dbname>;Trusted_Connection=True;"
},
В Startup.cs у меня есть следующая строка в ConfigureServices
services.AddDbContext<MyContext>(options => {
options.UseSqlServer(Configuration.GetConnectionString("MyDB"));
});
И оттуда я установил контроллер MVC с представлениями, используя Entity Framework.
В IIS для аутентификации Windows установлено значение «Да», а для анонимной аутентификации - «Нет». Для моего пула приложений установлено значение «Нет управляемого кода» с ApplicationPoolIdentity.
Редактировать: проблема
Чтобы сформулировать реальную проблему, которую я пытаюсь решить, у меня есть база данных SQL Server на удаленном сервере интрасети, которая обеспечивает доступ к подмножеству всей компании через проверку подлинности Windows. Если я хочу создать приложение ASP.NET для предоставления API для этой базы данных, размещенной в IIS, каков наилучший способ сделать это? Предполагая, что:
- Я не хочу самостоятельно управлять разрешениями или дублировать их каким-либо образом
- Люди, которые имеют доступ к базе данных напрямую, должны иметь доступ к API, люди, которые не имеют доступа.
- Если они обращаются к нему из внутренней сети во время входа в Windows, им не нужно будет снова входить в систему.
Я предполагал, что могу просто передать их учетные данные Windows из IIS через приложение на сервер SQL, но я начинаю задумываться, так ли это на самом деле.