2009-07-15 35 views
26

Máy chủ lưu trữ csharpindepth.com gần đây đã được di chuyển.Lỗi quyền người dùng khi truy cập cơ sở dữ liệu "cá thể người dùng" từ ASP.NET

Hầu hết nó được làm việc tốt, nhưng tôi không thể có được ở các cơ sở dữ liệu sử dụng để giữ errata, ghi chú, vv

chi tiết liên quan:

  • 32 bit Windows Server 2003
  • SQL Server Express 2005 đã cài đặt
  • Hồ bơi ASP.NET chạy trong tài khoản "DỊCH VỤ MẠNG"
  • .NET 3.5
  • Mọi người đều có quyền đầy đủ các tập tin cơ sở dữ liệu (vào lúc này, chỉ để cai trị mà ra!) Chuỗi
  • kết nối:

    Data Source=.;AttachDbFilename=|DataDirectory|\WebSiteData.mdf; 
    Integrated Security=True;User Instance=True 
    
  • Tôi đang kết nối chỉ bằng cách tạo ra một mới WebSiteDataContext (trong đó có các kết nối trên chuỗi làm mặc định của nó)

Sử dụng ứng dụng bảng điều khiển thử nghiệm nhỏ chạy từ thư mục chứa tệp, tài khoản quản trị viên, sử dụng cùng một truy vấn, tôi có thể xem nội dung của cơ sở dữ liệu.

Trong ASP.NET Tôi nhận được ngoại lệ này:

SqlException (0x80131904): User does not have permission to perform this action. 

EDIT: Thông tin chi tiết, đây là stack trace:

[SqlException (0x80131904): User does not have permission to perform this action.] 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844759 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392 
    System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +35 
    System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +144 
    System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +342 
    System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +221 
    System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +189 
    System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +4859187 
    System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +31 
    System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +433 
    System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +66 
    System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +499 
    System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +65 
    System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117 
    System.Data.SqlClient.SqlConnection.Open() +122 
    System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) +44 
    System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() +45 
    System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() +20 
    System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +57 
    System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +35 

EDIT: Tôi đã sai lầm về tên tập tin cần phải được quyền - thay đổi chuỗi kết nối để làm cho nó nói chuyện với một tập tin khác nhau không thay đổi lỗi.

ProcMon không bao giờ thấy nó chạm vào tập tin ...

EDIT: oddities Hơn nữa - khởi động lại các hồ bơi ứng dụng với nó chạy dưới tài khoản Local System vẫn có vấn đề, đó là khoảng như lẻ như nó được! Nó như thể, mặc dù thông báo lỗi, nó thực sự cố gắng để làm điều gì đó không thể (ví dụ với con đường sai) thay vì chỉ là một vấn đề quyền.

EDIT: Thông tin thêm - Tôi vừa chạy ứng dụng bảng điều khiển thử nghiệm nhỏ từ dịch vụ là "DỊCH VỤ MẠNG" và (sau lần thử đầu tiên đã hết thời gian) thành công. Vì vậy, nó không phải là một điều khoản về tài khoản người dùng ... nó là một cái gì đó về môi trường mà nó chạy ...

+52

OMG, Jon Skeet * đã hỏi * một câu hỏi? – rlbond

+0

DataDirectory là đường dẫn UNC hay ổ đĩa được ánh xạ? –

+0

@Brian: Không, | DataDirectory | là cách đề cập đến App_Data trong ASP.NET. Làm việc tốt trên máy cũ, và hoạt động tốt trong môi trường dev địa phương của tôi ... –

Trả lời

0

Điều đầu tiên tôi sẽ làm là tắt filemon (hoặc tốt hơn Process Monitor) để xem nếu IIS quy trình có thể mở tệp cơ sở dữ liệu - có vẻ như vấn đề bảo mật đối với tôi.

Ngoài ra: Đảm bảo rằng thư mục ~/App_Data không chỉ đọc. Ngoài ra, hãy kiểm tra xem bạn có cấp quyền đầy đủ cho " Dịch vụ mạng ”cho cùng một thư mục

Bạn có thể muốn chạy IISRESET để khởi động lại IIS và để làm mới quyền của nó.

+1

Tôi đã cố gắng sử dụng ProcMon, chưa có nhiều niềm vui. Vẫn đang cố gắng ... –

2

Bạn đã làm điều này chưa?

Để cấu hình SQL Server cho Windows tích hợp an ninh

Từ menu Start của Windows, chọn Microsoft SQL Server, và sau đó chọn Enterprise Manager.

Mở nút cho máy chủ và mở rộng nút cho cơ sở dữ liệu mà bạn muốn cấp cho người dùng quyền.

Nhấp chuột phải vào nút Người dùng và chọn Người dùng cơ sở dữ liệu mới.

Trong hộp thoại Thuộc tính người dùng cơ sở dữ liệu , nhập tên miền \ tên người dùng vào hộp tên đăng nhập , sau đó bấm OK. Ngoài ra, hãy định cấu hình Máy chủ SQL để cho phép tất cả người dùng miền truy cập vào cơ sở dữ liệu .

Source

Vì vậy, về cơ bản xác minh rằng bạn có "NT AUTHORITY \ NETWORK SERVICE" liệt kê ở đó.

Cũng trong SQL 2008 ít nhất, không chắc chắn về năm 2005 bạn cũng sẽ đặt ở cấp máy chủ (Server -> Security -> Logins).

+0

Kiểm tra ngay bây giờ ... –

+0

biết nếu nó chưa hoạt động? –

+0

Chỉ cần đặt nó ở cấp độ máy chủ quá, không có niềm vui. –

2

Integrated Security = True

là user logon (s) trong cơ sở dữ liệu kết nối với tài khoản người dùng trong máy tính? Nó có thể là có một số vấn đề lập bản đồ xung quanh đó?

+0

Không có đăng nhập người dùng trong cơ sở dữ liệu - nó chỉ là một tệp cơ sở dữ liệu. –

0

Khi bạn nói người dùng có toàn quyền đối với tệp, tất cả người dùng có toàn quyền trên thư mục app_data không? Sql sẽ cần phải tạo một tập tin khóa bên cạnh tập tin MDF.

Bạn cũng chắc chắn rằng phiên bản SQL Express đã bật các cá thể người dùng?

+0

@blowdart: Thư mục, vâng. Các trường hợp người dùng được kích hoạt có thể là nó - ở đâu? –

+0

Đối tác của tôi về tội phạm nói rằng anh ấy đã kiểm tra xem các cá thể người dùng có thực sự được bật hay không. –

+0

OK, hãy thử xóa thông số cá thể người dùng tạm thời và xem điều gì xảy ra. Chỉ trong trường hợp nó trở nên rất bối rối. Chúng sẽ biến mất trong năm 2010 anyway :) – blowdart

1

Nếu bạn đang sử dụng người dùng instancing bạn đang kết nối như quản trị anyway, mà tình cờ là lý do tại sao nó không được khuyến khích cho các kịch bản lưu trữ. Các vấn đề perms tôi có xu hướng để có được những vật lý trên các tập tin chính mình, không phải là thư mục - tách cơ sở dữ liệu có xu hướng dải perms.

Điều này có thể hữu ích nếu bạn có thể thu hẹp chính xác vị trí ngoại lệ xảy ra. Hành động gì đang cố gắng thực hiện? Cơ sở dữ liệu mở, đọc, viết? Ngoài ra, hãy thử một cơ sở dữ liệu khác (ví dụ, nó là cơ sở dữ liệu cụ thể) và thử một phiên bản không được người dùng sử dụng; đính kèm cơ sở dữ liệu vào một cá thể.

+0

Kết nối cơ sở dữ liệu. Sẽ cập nhật câu hỏi bằng dấu vết ngăn xếp. –

+0

Tôi đoán bạn đã kiểm tra xem máy chủ SQL của bạn có hỗ trợ người dùng instancing không? Xem http://msdn.microsoft.com/en-us/library/ms254504(VS.80).aspx. SQLEXPRESS hỗ trợ điều này theo mặc định, nhưng bạn không kết nối với SQLEXPRESS để có thể nó không được kích hoạt. –

+0

Yup, được bật. –

0

Bạn đã thử chạy aspnet_regsql.exe trên máy chủ để có khả năng khởi động một cái gì đó trở lại vào vị trí (loại giống như cách chạy aspnet_regiis một lần trong mặt trăng xanh)? Scott Gu có tổng quan cơ bản về toàn bộ quá trình tìm thấy here.

+0

Tôi không nghĩ đó là một loại công cụ tương tự, nhưng dù sao cũng thử. Không giống như nó thực sự để sử dụng với các trường hợp người dùng mặc dù. –

+0

Rất tiếc. Tôi đã nghĩ rằng quá, cho đến khi tôi nhìn về phía cuối của bài viết và nhận thấy các thiết lập cấu hình đã AttachDbFilename đi với nó và nghĩ rằng nó có thể giúp đỡ. –

6

Ví dụ trẻ có bắt đầu không? Khi một cơ sở dữ liệu RANU được yêu cầu thể hiện chủ (. \ SQLEXPRESS trong trường hợp này) phải tạo một cá thể 'con', nói cách khác bắt đầu quá trình sqlservr.exe như một tiến trình người dùng đang chạy dưới các thông tin của người dùng đã yêu cầu RANU kết nối từ thể hiện .SQLEXPRESS.Trong trường hợp này, cá thể sẽ phải được bắt đầu là 'DỊCH VỤ MẠNG LƯỚI'.

Để xác nhận nếu trường hợp đứa trẻ đang bắt đầu, kết nối với các trường hợp tổng thể và kiểm tra sys.dm_os_child_instances (\ SQLEXPRESS.):

SELECT * 
FROM sys.dm_os_child_instances 

Nếu một NETWORK SERVICE sở hữu dụ đứa trẻ đang bắt đầu, mất nó instance_pipe_name và kết nối thẳng đến thể hiện con:

sqlcmd -S np:\\.\pipe\<child pipe name>\tsql\query 

Lý tưởng nhất, kết nối như NETWORK SERVICE (ví dụ như từ một cmd console tương tác bắt đầu như DỊCH VỤ NEWTORK, có lẽ sử dụng at.exe để sắp xếp nó 1 phút trong thời gian tới.). Nếu điều đó làm việc, bước cuối cùng là cố gắng đính kèm MDF bằng cách sử dụng ordinarry sp_attach_db.

Ý tưởng về các bước này không phải là để giải quyết vấn đề, nhưng xác định nguyên nhân lỗi, vì lỗi bạn nhận được là kinda generic và ... không chính xác hữu ích.

+0

Không có dấu hiệu cho thấy trường hợp con đã được bắt đầu ... và thực sự tôi nghi ngờ đó là vấn đề, nhưng tôi không thể thấy chính xác nó không thành công. Thay đổi hồ bơi ứng dụng của tôi để chạy vì hệ thống cục bộ cũng không giúp được gì, điều này là kỳ quặc nhất. –

+0

Cách dễ nhất để bắt đầu bàn điều khiển là DỊCH VỤ MẠNG là gì? Sẽ rất thú vị khi thử ứng dụng thử nghiệm của tôi theo cách tương tự ... –

+0

Tôi biết cách khởi động hệ thống bằng cách sử dụng AT.exe: lúc 10:45 tối/cm tương tác (trong đó 10:45 tối tương tự 1 phút). Đối với dịch vụ NETWORK tôi bị mất vì tôi không biết làm thế nào người ta có thể lấy nó ... mật khẩu. RUNAS nhu cầu là (bên cạnh đó tôi không chắc chắn MẠNG DỊCH VỤ được phép chạy trong runas) và cố gắng tạo ra một dịch vụ giả với sc.exe: sc tạo cmd_as_ns binpath = c: \ WINDOWS \ system32 \ cmd.exe bắt đầu = nhu cầu obj = "MẠNG DỊCH VỤ" cũng cần mật khẩu của nó (ngay cả sau khi gói cmd.exe trong srvany.exe). –

3

Câu hỏi này xuất hiện liên quan đến: "Cannot open user default database. Login failed." after installing SQL Server Management Studio Express

Dường như Trường hợp người dùng và SQL Server Express có một số vấn đề thú vị. Bạn có thể muốn xem http://blogs.msdn.com/b/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx. Điều này dường như làm các trick cho hầu hết những người có vấn đề này.

+0

Cảm ơn - sẽ làm gì nếu tôi lại gặp lại nó. May mắn là tôi đã chuyển đi từ việc sử dụng cơ sở dữ liệu cho vấn đề cụ thể này. Chỉ cần một tập tin XML là tốt, và đơn giản hơn rất nhiều :) –

0

Vì bạn có Trusted Authentication = True, kết nối sử dụng ngữ cảnh bảo mật của quá trình gọi. Điều đó có nghĩa là bạn đang chạy máy chủ phát triển trong ngữ cảnh bảo mật của người dùng đã đăng nhập, vì vậy mọi thứ đều hoạt động tốt. Khi bạn chạy trong IIS, bạn đang ở trong bối cảnh an ninh của quá trình hồ bơi ứng dụng, đó là dịch vụ mạng, mà không có một hồ sơ người dùng, do đó nó bị treo.

Để khắc phục, hãy sử dụng giải pháp # 1 hoặC# 2.

1.) Thay đổi danh tính của nhóm ứng dụng thành người dùng bình thường có quyền truy cập vào cơ sở dữ liệu, dưới dạng tài khoản tùy chỉnh. GỢI Ý: đặt người dùng này: SELECT owning_principal_name FROM sys.dm_os_child_instances WHERE heart_beat = 'alive'

2.) Sử dụng chuỗi kết nối có tên người dùng và mật khẩu; có nghĩa là sử dụng Xác thực Máy chủ SQL, không phải Trusted Authentication = True.

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