2010-05-10 37 views
87

Tôi biết điều này gần như trùng lặp với: The error "Login failed for user 'NT AUTHORITY\IUSR'" in ASP.NET and SQL Server 2008Login failed for user 'username' - System.Data.SqlClient.SqlException with LINQ in external project/class library nhưng một số thứ không thêm so với các ứng dụng khác trên máy chủ của tôi và tôi không chắc chắn lý do.

Hộp đang được sử dụng:

Web Box
SQL Box
Kiểm tra SQL Box

Ứng dụng của tôi:

Tôi đã có aASP.NET ứng dụng Web, tài liệu tham khảo một thư viện lớp có sử dụng LINQ-to-SQL. Chuỗi kết nối được thiết lập đúng trong thư viện lớp. Theo Login failed for user 'username' - System.Data.SqlClient.SqlException with LINQ in external project/class library Tôi cũng đã thêm chuỗi kết nối này vào Ứng dụng web.

Chuỗi kết nối sử dụng thông tin SQL như vậy (trong cả hai ứng dụng web và thư viện lớp):

<add name="Namespace.My.MySettings.ConnectionStringProduction" 
     connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password" 
     providerName="System.Data.SqlClient" /> 

Kết nối này xác nhận là làm việc qua thêm nó vào Server Explorer. Đây là chuỗi kết nối mà tệp .dbml của tôi đang sử dụng.

Vấn đề:

tôi nhận được lỗi sau:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'. 

Bây giờ tham khảo này The error "Login failed for user 'NT AUTHORITY\IUSR'" in ASP.NET and SQL Server 2008 nó nói rằng thực sự là dịch vụ mạng nội bộ và sử dụng bất kỳ tên không miền khác sẽ không hoạt động.

Nhưng tôi bối rối vì tôi đã kiểm tra cả SQL Box và SQL Test Box SQL Management Studio và cả hai có NT AUTHORITY/NETWORK SERVICE trong phần Bảo mật -> Đăng nhập, ở cấp cơ sở dữ liệu, không được liệt kê trong Bảo mật -> Người dùng, nhưng ở cấp độ cơ sở dữ liệu Bảo mật -> Người dùng Tôi có người dùng được hiển thị trong chuỗi kết nối.

Ở cấp độ NTFS trên máy chủ web, các quyền có NETWORK SERVICE có toàn quyền kiểm soát.

Lý do tại sao tôi bối rối là vì tôi có nhiều ứng dụng web khác trên Máy chủ Web của tôi, tham khảo cơ sở dữ liệu trên cả Hộp SQL và Hộp kiểm tra SQL và tất cả đều hoạt động. Nhưng tôi không thể tìm thấy sự khác biệt giữa chúng và ứng dụng hiện tại của tôi, ngoài việc tôi đang sử dụng thư viện lớp. Điều đó có quan trọng không? Kiểm tra các điều khoản NTFS, thiết lập các thông tin đăng nhập bảo mật ở cấp độ máy chủ và cơ sở dữ liệu, chuỗi kết nối và phương thức kết nối (thông tin SQL Server), và nhóm ứng dụng IIS và các tùy chọn thư mục khác, đều giống nhau.

Tại sao các ứng dụng này hoạt động mà không thêm tên máy $ vào quyền của một trong các hộp SQL của tôi? Nhưng đó là điều mà một liên kết đang bảo tôi làm gì để khắc phục vấn đề này.

+0

Vì vậy, để tóm tắt lại, bạn không sử dụng người dùng cơ sở dữ liệu? Chúng tôi tạo ra một và có thể chuyển đổi giữa nó và SA tùy thuộc vào những gì chúng ta cần làm ... – jcolebrand

+0

Trong chuỗi kết nối tôi đang sử dụng một người dùng cơ sở dữ liệu, mà tôi đã tạo trong khu vực Security -> Logins, thêm nó vào Security -> người dùng của cơ sở dữ liệu, và cho nó quyền dbo. Đó là cách tôi đã làm tất cả các ứng dụng khác của tôi quá. – SventoryMang

Trả lời

115

DỊCH VỤ MẠNG và LocalSystem sẽ tự xác thực là tài khoản cố định cục bộ (dịch vụ mạng nội bộ và hệ thống dựng sẵn) nhưng cả hai sẽ xác thực tài khoản máy từ xa.

Nếu bạn thấy lỗi như Login failed for user 'DOMAIN\MACHINENAME$' điều đó có nghĩa là quá trình chạy dưới dạng DỊCH VỤ MẠNG hoặc khi LocalSystem đã truy cập tài nguyên từ xa, đã tự xác thực là tài khoản máy và bị từ chối ủy quyền.

Ví dụ điển hình là ứng dụng ASP chạy trong nhóm ứng dụng được thiết lập để sử dụng chứng chỉ dịch vụ NETWORK và kết nối với SQL Server từ xa: nhóm ứng dụng sẽ xác thực là máy chạy hồ bơi ứng dụng và tài khoản máy này cần được cấp quyền truy cập.

Khi quyền truy cập bị từ chối vào tài khoản máy, khi đó quyền truy cập phải được cấp cho tài khoản máy. Nếu máy chủ từ chối đăng nhập 'DOMAIN \ MACHINE $', thì bạn phải cấp quyền đăng nhập cho 'DOMAIN \ MACHINE $' chứ không phải cho DỊCH VỤ MẠNG. Cấp quyền truy cập vào DỊCH VỤ MẠNG sẽ cho phép một quy trình địa phương chạy dưới dạng DỊCH VỤ MẠNG để kết nối, không phải từ xa, vì điều khiển từ xa sẽ xác thực là, bạn đã đoán, DOMAIN \ MACHINE $.

Nếu bạn mong đợi ứng dụng asp kết nối với SQL Server từ xa dưới dạng đăng nhập SQL và bạn nhận được ngoại lệ về DOMAIN \ MACHINE $ nghĩa là bạn sử dụng Bảo mật tích hợp trong chuỗi kết nối. Nếu điều này là bất ngờ, điều đó có nghĩa là bạn đã làm hỏng các chuỗi kết nối bạn sử dụng.

+0

Đúng là tôi đã thu thập điều gì, cảm ơn bạn đã giải thích. Tuy nhiên, câu hỏi vẫn còn, tất cả các ứng dụng của tôi được lưu trữ trên máy chủ Web của tôi nhưng truy cập cơ sở dữ liệu trên các hộp kiểm tra SQL hoặc SQL, đó có thể là truy cập từ xa không? Tuy nhiên, chúng đang hoạt động ... nhưng cả hai hộp SQL của tôi đều không cấp quyền truy cập DOMAIN \ MACHINENAME $. – SventoryMang

+0

Oh Ngoài ra, tôi mong đợi để kết nối với SQL server như là một đăng nhập SQL nhưng tôi đã đăng chuỗi kết nối của tôi, tôi không sử dụng tích hợp Security = True tùy chọn, những gì khác nó có thể được ?? – SventoryMang

+2

Có ba giải thích có thể có: 1) họ sử dụng SQL auth thay vì auth tích hợp (có vẻ là hợp lý nhất, vì ví dụ bạn có userid và password trong chuỗi kết nối) 2) họ sử dụng auth tích hợp và chạy trong ứng dụng cuộc thăm dò sử dụng thông tin xác thực khác hoặc 3) họ sử dụng auth được tích hợp nhưng ứng dụng ASP mạo danh người gọi, do đó kích hoạt ủy quyền bị hạn chế: http://technet.microsoft.com/en-us/library/cc739587%28WS.10%29. aspx. –

10

Bí quyết mà làm việc cho tôi là để loại bỏ Integrated Security từ chuỗi kết nối của tôi và thêm một thường xuyên User ID=userName; Password=password chuỗi kết nối của bạn trong App.config của libruary của bạn có thể không được sử dụng bảo mật tích hợp nhưng một trong những tạo ra trong Web.config là!

+3

Một tỷ cảm ơn bạn. Rất lớn, giúp đỡ rất nhiều. Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn. Đây là, tôi chắc chắn, rất rõ ràng nhưng đối với những người tương lai, đó là Id người dùng = một cái gì đó; Mật khẩu = một cái gì đó; – shubniggurath

+1

Tôi đã nhận được cùng một lỗi trong tiêu đề của bài đăng. Tôi thấy rằng 'User Id = yourUserid Password = yourPassword' bị bỏ qua khi "'trust connection = true'" nằm trong chuỗi kết nối cơ sở dữ liệu. Tôi đã xóa "'connection connection = true'" khỏi chuỗi của tôi và điều đó đã khắc phục được sự cố của tôi. Điều này đã không xảy ra cho đến khi tôi chuyển ứng dụng từ gỡ lỗi trong VS 2012 sang iis 8. –

9

Tôi đã thêm <identity impersonate="true" /> vào web.config của mình và nó hoạt động tốt.

+4

Chỉ cần hiểu điều này sẽ thay đổi ngữ cảnh mà ứng dụng ASP.NET chạy dưới toàn bộ. Thay vì chạy theo ngữ cảnh 'DỊCH VỤ MẠNG' mặc định, nó sẽ chạy trong ngữ cảnh của người dùng bằng ứng dụng (ví dụ: Domain \ someUser). Đôi khi điều này là OK, nhưng chỉ hiểu sự thay đổi này không chỉ là một sửa chữa nhanh cho OP và có những tác động hạ lưu khác mà có thể/có thể không được mong muốn. – atconway

+0

[MSDN trên ] (https://msdn.microsoft.com/en-us/library/72wdk8cc (v = vs.71) .aspx) – Timothy

18

Lỗi này xảy ra khi bạn đã định cấu hình ứng dụng của mình với IIS và IIS đi tới SQL Server và cố đăng nhập bằng thông tin xác thực không có quyền phù hợp. Lỗi này cũng có thể xảy ra khi sao chép hoặc sao chép được thiết lập. Tôi sẽ đi qua một giải pháp hoạt động luôn và rất đơn giản. Đi tới SQL Server >> Bảo mật >> Đăng nhập và nhấp chuột phải vào NT AUTHORITY \ NETWORK SERVICE và chọn Properties

Trong màn hình mới mở của Thuộc tính đăng nhập, hãy chuyển đến tab “Ánh xạ người dùng”. Sau đó, trên tab “Ánh xạ người dùng”, chọn cơ sở dữ liệu mong muốn - đặc biệt là cơ sở dữ liệu mà thông báo lỗi này được hiển thị. Trên màn hình thấp hơn, hãy kiểm tra vai trò db_owner. Nhấp vào OK.

+2

Đây là giải pháp cho tôi vì ứng dụng web và cơ sở dữ liệu nằm trên cùng một máy. Tôi vẫn gặp lỗi "Đăng nhập không thành công cho người dùng 'DOMAIN \ MACHINENAME $" nhưng việc thêm máy vào thông tin đăng nhập SQL không giúp được gì, nhưng việc thêm "NT AUTHORITY \ NETWORK SERVICE" đã thực hiện. Mặc dù bạn không nên sử dụng vai trò db_owner trừ khi nó là cần thiết, bình thường db_datareader và db_datawriter là đủ. – JimiSweden

9

Một đồng nghiệp có cùng lỗi và đó là do lỗi cấu hình nhỏ trong IIS.
Hồ bơi ứng dụng sai đã được gán cho ứng dụng web.

Thật vậy, chúng tôi sử dụng Hồ bơi ứng dụng tùy chỉnh với một Danh tính cụ thể để đáp ứng nhu cầu của chúng tôi.

Trong trình quản lý IIS cục bộ của mình -> Trang web -> Trang web mặc định -> Tên ứng dụng web của chúng tôi -> Cài đặt cơ bản ... Hồ bơi ứng dụng là "DefaultAppPool" thay vì Hồ bơi ứng dụng tùy chỉnh của chúng tôi.

Đặt nhóm ứng dụng chính xác đã giải quyết được sự cố.

2

Chúng tôi đã nhận được các thông báo lỗi tương tự trong khi xử lý cơ sở dữ liệu Dịch vụ phân tích. Nó bật ra rằng tên người dùng, được sử dụng để chạy dụ dịch vụ phân tích, đã không được thêm vào đăng nhập bảo mật của máy chủ SQL.

Trong SQL Server 2012, các dịch vụ SQL Server và phân tích được cấu hình để chạy như người dùng khác nhau theo mặc định. Nếu bạn đã đi với các giá trị mặc định, hãy luôn đảm bảo rằng người dùng AS có quyền truy cập vào nguồn dữ liệu của bạn!

+1

Tôi gặp vấn đề tương tự. Lỗi từ SSAS giống nhau, nhưng tài khoản không phải là Dịch vụ mạng. Tài khoản thực sự là: Dịch vụ NT \ MSOLAP $ INSTANCENAME – cdonner

5

Đối với tôi, sự cố đã được giải quyết khi tôi thay thế tài khoản Tích hợp mặc định 'ApplicationPoolIdentity' bằng tài khoản mạng được phép truy cập vào cơ sở dữ liệu.

Cài đặt có thể được thực hiện trong Internet Information Server (IIS 7+)> Application Pools> Advanded Cài đặt> Process Model> nhận dạng

0

I Had cùng một vấn đề trước đó, loại bỏ Persist Security Info=True từ ConnectionString làm việc cho tôi.

0

Tôi đã dành một vài giờ cố gắng khắc phục sự cố và cuối cùng tôi đã nhận được sự cố - Trình duyệt SQL Server đã bị "Ngừng". Việc sửa chữa là thay đổi nó sang chế độ "tự động":

If it is disabled, go to Control Panel->Administrative Tools->Services, and look for the SQL Server Agent. Right-click, and select "Properties." From the "Startup Type" dropdown, change from "Disabled" to "Automatic".

quote from here

1

Kiểm tra xem bạn có

User Instance=true 

trong chuỗi kết nối. Hãy thử xóa nó sẽ giải quyết vấn đề của bạn.

7

Trong trường hợp của tôi, tôi đã có Identity="ApplicationPoolIdentity" cho Hồ bơi ứng dụng IIS của mình.

Sau khi tôi thêm IIS APPPOOL\ApplicationName người dùng vào SQL Server, nó hoạt động.

+2

Tôi tin rằng điều này sẽ chỉ hoạt động nếu IIS và máy chủ SQL nằm trên cùng một máy. –

+1

Điều này làm việc cho tôi! Tôi có một thiết lập máy chủ IIS-SQL cục bộ. –

5

Về cơ bản để giải quyết này, chúng ta cần phải có một số thiết lập như thế

  • Web App Chạy theo ApplicationPoolIdentity
  • Application
  • Web kết nối với cơ sở dữ liệu thông qua ADO.Net sử dụng Windows Authentication trong chuỗi kết nối

Chuỗi kết nối được sử dụng với xác thực Windows bao gồm thuộc tính Trusted_Connection=Yes hoặc thuộc tính tương đương Integrated Security=SSPI trong Web.config tệp

Kết nối cơ sở dữ liệu của tôi ở chế độ Xác thực Windows. Vì vậy, tôi giải quyết nó bằng cách đơn giản thay đổi Application Pools Sắc lấy ApplicationPoolIdentity để đăng nhập tên miền của tôi trong credentials DomainName \ MyloginId

Bước:

  1. Bấm vào Application Pools
  2. Chọn Tên đơn đăng ký của bạn

  3. Tới nâng cao Thiết

  4. Mở rộng Process Model và nhấp nhận dạng. Nhấp vào ba chấm ở bên phải.
  5. Nhấp vào Đặt ... và Cung cấp thông tin đăng nhập tên miền của bạn bằng chứng chỉ

Đối với tôi, nó đã được giải quyết.

Lưu ý: Trong môi trường sản xuất hoặc CNTT, bạn có thể có tài khoản dịch vụ dưới cùng một miền cho nhận dạng hồ bơi ứng dụng. Nếu có, hãy sử dụng tài khoản dịch vụ thay vì thông tin đăng nhập của bạn.

1

Tôi cũng có lỗi này với người dùng được xác thực Máy chủ SQL

Tôi đã thử một số bản sửa lỗi nhưng chúng không hoạt động.

Giải pháp trong trường hợp của tôi là định cấu hình "Chế độ xác thực máy chủ" để cho phép xác thực máy chủ SQL, trong Management Studio: Properties/Security.

1

Điểm duy nhất mà mọi người dường như đã bỏ qua là bạn có thể muốn tích hợp bảo mật = true. Bạn có thể có các trang web đang chạy dưới một tài khoản hồ bơi. Đó là tất cả tốt như vậy và nó vẫn có thể nhấn máy chủ SQL với thông tin xác thực người dùng ban đầu và không phải của hồ bơi. Nó được gọi là ủy nhiệm hạn chế. Nếu bạn bật nó và thiết lập một cửa sổ SPN sẽ dịch thông tin xác thực của hồ bơi với yêu cầu của người dùng vào dịch vụ cuối cùng (SQL chỉ là một dịch vụ như vậy). Bạn phải đăng ký máy chủ SQL ONE và ONLY phục vụ các yêu cầu SQL trên máy chủ web. Thiết lập tất cả điều này là quá nhiều cho tôi để cố gắng mô tả chính xác ở đây. Tôi đã mất khá nhiều thời gian để tự mình làm việc đó.

Các vấn đề liên quan