簡體   English   中英

IIS 無法將 Windows 憑據傳遞到 SQL Server for ASP.NET Core 應用程序

[英]IIS fails to pass windows credentials through to SQL Server for ASP.NET Core app

我在一家大公司工作,每個人都有一個 Intranet 和 Windows AD 登錄。 我們有許多內部 SQL Server 數據庫,它們允許我們使用 Windows 身份驗證登錄,我正在嘗試通過 ASP.NET Core 應用程序連接到其中之一。 我可以通過 SQL Server Management Studio 連接到這個數據庫並很好地查詢表。

我盡可能地遵循了使用現有數據庫ASP.NET Core 應用程序教程,並創建了一個模型類來測試,看看我是否可以從數據庫中讀取數據。 在 Visual Studio 中使用 IIS Express 進行調試時,我可以在訪問自動生成的控制器和視圖時從數據庫中讀取數據。

調試時一切正常,但發布到 IIS 時,我收到以下錯誤:

SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.

其中 domain 是我的域,computername 是我的計算機名稱。 這是意料之中的,因為我的計算機本身無法訪問數據庫。 但它不應該嘗試使用該系統帳戶(帶有美元符號)進行連接,它應該嘗試與我的 Windows 帳戶連接: <DOMAIN>\\<USERNAME>

更奇怪的是,該應用程序似乎確實以某種身份識別了我的 Windows 憑據 - 當我訪問主頁時,我得到熟悉的"Hello, <DOMAIN>\\<USERNAME>!" 導航欄中的消息。 因此,Windows 憑據肯定會傳遞給應用程序,但由於某種原因,在嘗試通過 DbContext 連接到數據庫時未通過。

我在這里遺漏了一些明顯的東西嗎?

我的代碼

我從 Visual Studio 的 ASP.NET Core Web 應用程序模板開始。

在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 控制器。

IIS 將 Windows 身份驗證設置為“是”,將匿名身份驗證設置為“否”。我的應用程序池使用 ApplicationPoolIdentity 設置為“無托管代碼”。

編輯:問題

為了說明我試圖解決的實際問題,我在遠程 Intranet 服務器上有一個 SQL Server 數據庫,它允許通過 Windows 身份驗證訪問整個公司的一個子集。 如果我想創建一個 ASP.NET 應用程序來為該數據庫提供 API,由 IIS 托管,那么最好的方法是什么? 假設:

  1. 我不想自己管理權限或必須以某種方式復制它們
  2. 直接訪問數據庫的人應該可以訪問 API,沒有的人不應該。
  3. 如果他們在登錄到 Windows 時從 Intranet 中訪問它,則他們不必再次登錄。

我以為我可以通過應用程序將他們的 Windows 憑據從 IIS 傳遞到 SQL 服務器,但我開始懷疑是否確實如此。

您正在為 SqlServer 使用實體框架,而 EF 正在使用 ADO.NET SqlClient。 因此Trusted_Connection=yes; 不起作用。

添加Integrated Security=true; 相反,它應該被修復。

這里有一些資源可以閱讀https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax

在詳細了解 .NET 以及 Windows 身份驗證在 IIS 上實際執行的操作后,我要說不推薦我嘗試執行的操作。 將 Windows 憑據傳遞給 .NET 應用程序以讀取它們與實際以該用戶身份執行輔助進程之間存在差異。 后一種情況是我想要做的,但應該在 IIS 中使用可以登錄數據庫的用戶設置我的應用程序池,並使用 Windows 憑據來驗證具有訪問權限的用戶列表。

不是挖掘舊線程,但只要設置了 Identity Impersonate = True,這個函數就應該可以工作。 這里有一些正在處理的東西。

GitHub 文檔

步驟1打開appsettings文件,添加Integrated Security = true; 如下所示

{“ ConnectionStrings”:{“ MatcoDashboard”:“服務器=計算機名\\ MSQL2008R2;數據庫=數據庫名稱;集成安全性= true; ”},

步驟-2 復制您的應用程序池名稱IIS APPPOOL \\ matco

您的應用程序池名稱= IIS APPPOOL \\ matco

步驟-3轉到Sql Server Management Studio,使用Windows身份驗證創建新用戶“ IIS APPPOOL \\ matco” ,然后使用數據庫映射顯示以下圖像詳細信息步驟

步驟1 創建新用戶

步驟2 創建名為IIS APPPOOL \\ matco的新用戶

步驟3: 使用數據庫進行用戶映射

轉到IIS瀏覽您的頁面

我將添加我的答案,因為這是我解決此問題的方式。
將“$”符號添加到登錄名/用戶的原因必須與托管應用程序的 IIS 有關。

我不是這方面的專家,所以我不能真正深入,但我已經將 IIS 用戶添加到登錄名,然后它就可以工作了。

USE [master]
GO

CREATE LOGIN [IIS APPPOOL\'name'] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO

ALTER SERVER ROLE [sysadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [securityadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [serveradmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [setupadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [processadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [diskadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [dbcreator] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [bulkadmin] ADD MEMBER [IIS APPPOOL\'name']
GO  

您必須將“名稱”更改為您的 IIS 托管應用程序名稱。 因此,例如,如果您在 ISS 中的應用程序/站點名稱是“My-Backend-App”,您應該執行以下操作:

CREATE LOGIN [IIS APPPOOL\My-Backend-App] FROM WINDOWS ...  

所以所有的名字都應該是“My-Backend-App”。

將此用戶添加到登錄時,我的后端應用程序可以訪問和創建數據庫、創建表、訪問數據等...

旁注:我使用 Windows 事件記錄器發現這是我的問題。 我的應用程序剛剛崩潰,顯示“500.30”錯誤,但沒有給出真實信息。

您可以從 Windows 搜索訪問“事件查看器”應用程序。 然后您可以轉到“應用程序”,您的機器上發生了所有應用程序錯誤/崩潰,在這種情況下也是原因。 它說在嘗試登錄 SQL 時找不到用戶“myUser$”,但 Windows 身份驗證用戶是“myUser”。 所以出於某種原因,它添加了一個“$”符號並且無法登錄。我上面的修復解決了這個問題,你可以登錄等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM