2009-09-09 21 views
6

Tôi có một trang web ASP.NET v2.0 (không phải ứng dụng web) trong đó thư mục gốc là công khai, nhưng thư mục con "Quản trị" yêu cầu xác thực. Tất cả mọi thứ về thiết lập là rất chung chung - Tôi đã sử dụng một chuỗi kết nối được định nghĩa trong root.config gốc và nhà cung cấp AspNetSqlMembershipProvider chuẩn, và tôi đang sử dụng điều khiển Đăng nhập ASP.NET. Web.config trong thư mục Quản trị chỉ định rằng người dùng phải có vai trò "Quản trị".Bắt lỗi "Tự động tạo tệp cơ sở dữ liệu SQLExpress" cho trang web sử dụng AspNetSqlMembershipProvider, nhưng chuỗi kết nối là SQL Server 2005

Tôi đang sử dụng SQL Server 2008 và chuỗi kết nối của tôi là tốt; mọi trang cấp cơ sở đều được điều khiển dữ liệu và tất cả đều hoạt động tốt. Và cấu hình nhà cung cấp có vẻ tốt: khi tôi đăng nhập, sự kiện "OnLoggedIn" của Kiểm soát đăng nhập sẽ kích hoạt. Dòng cuối cùng trong mã sự kiện đó chuyển hướng tôi đến trang Admin/Default.aspx của tôi. breakpoint của tôi trong "OnLoggedIn" cho tôi thấy rằng tất cả là tốt cho đến khi chuyển hướng xuống vào thư mục quản lý của tôi ... và sau đó ...

... và sau đó tôi chờ ... và chờ đợi ...

Và sau đó tôi nhận được một lỗi nói với tôi nó có kinh nghiệm một "tập tin cơ sở dữ liệu SQLExpress tự động tạo lỗi."

Tại sao trên thế giới đột nhiên cố gắng tạo tệp SQL Server Express? Tại sao nó đột nhiên bỏ qua chuỗi kết nối của tôi?

Một đầu mối lạ: Ngay trước dòng cuối cùng của sự kiện "OnLoggedIn" tôi đặt trong trường hợp này: bool blnTest = User.IsInRole ("Admin");

Tôi muốn xem liệu blnTest = true. Điều gì xảy ra là quá trình truy cập dòng này ... và chờ ... và cuối cùng nói với tôi rằng nó không thể truy cập cơ sở dữ liệu SQL Server Express. Dường như bất kỳ tham chiếu nào (hoặc trong mã của tôi, hoặc đằng sau hậu trường) để xác định Vai trò của Người dùng, gọi cơ sở dữ liệu sai.

CHỈNH SỬA: Argh, đôi khi nó đợi khi tôi kiểm tra blnTest. Lần khác, nó ngay lập tức báo cáo giá trị là "sai".

+1

Chuỗi kết nối cho RoleProvider của bạn không? Nó có giống với AuthenticationProvider của bạn không? –

+0

Đó là một phần của web.config chỉ đơn giản là ...

Trả lời

10

Theo nhận xét của bạn, có vẻ như bạn chưa định cấu hình rõ ràng nhà cung cấp vai trò cho trang web của mình.

Nếu tất cả những gì trong web của bạn.cấu hình là:

<roleManager enabled="true" /> 

Sau đó, bạn đang dựa vào các nhà cung cấp mặc định tuyên bố tiếp tục lên hieracrchy cấu hình (Machine.config, web.config toàn cầu, vv)

Trong Machine.config bạn đã có thể có một cái gì đó như:

<roleManager> 
    <providers> 
    <add name="AspNetSqlRoleProvider" 
     connectionStringName="LocalSqlServer" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    <add name="AspNetWindowsTokenRoleProvider" 
     applicationName="/" 
     type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    </providers> 
</roleManager> 

như bạn có thể thấy, các nhà cung cấp đầu tiên được cấu hình để sử dụng một connectionString gọi LocalSqlServer - mà cũng thường được khai báo trong Machine.config:

<add name="LocalSqlServer" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
    providerName="System.Data.SqlClient"/> 

Và điều này được thiết kế để sử dụng cơ sở dữ liệu dựa trên tệp cục bộ sẽ được tạo nếu nó chưa tồn tại.

Vì vậy, để có được vai trò làm việc trên trang web của bạn, bạn nên ammend web.config gốc của bạn để một cái gì đó như:

<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlRoleProvider" 
     connectionStringName="YourConnectionStringName" 
     applicationName="/" 
     type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
    </providers> 
</roleManager> 

Sử dụng rõ ràng> yếu tố </sẽ loại bỏ tất cả các nhà cung cấp được định nghĩa trước cho loại đó.

+2

+1 Để giải thích mọi chi tiết –

+0

Cảm ơn, tôi biết câu hỏi này rất cũ nhưng nó cũng là một trợ giúp lớn cho tôi. Một câu hỏi, tôi biết có '' trong cả hai phần ' 'và' 'của tôi. Có vẻ như họ có cùng thông tin. Có ai biết tại sao tôi cần cả hai? –

+0

Bởi vì bạn có thể có những cái khác nhau (ví dụ bạn có thể muốn một nhà cung cấp vai trò tùy chỉnh hỗ trợ vai trò kế thừa, trong khi bạn hài lòng với nhà cung cấp thành viên mặc định). Trên hết, nếu bạn nhìn kỹ, bạn sẽ thấy chúng khác nhau: người ta thêm nhà cung cấp ** thành viên **, trong khi người kia thêm nhà cung cấp vai trò sql ** **. –

1

Khi bạn chỉ định tùy chọn AttachDBFilename trong chuỗi kết nối, bạn đang thực sự yêu cầu cá thể SQL Server được cấp phép-chỉ-trong-thời gian của riêng bạn, hay còn gọi là 'cá thể người dùng'. Ví dụ này được tạo ra bằng cách yêu cầu cá thể 'master' (instance. \ SQLEXPRESS) để cung cấp một cá thể con, ngụ ý sao chép master/model/msdb vào hồ sơ của bạn, bắt đầu một quá trình SQL Server mới trong tài khoản của bạn được cấu hình để sử dụng copy/master/msdb vừa mới sao chép, sau đó yêu cầu cá thể 'con' này để đính kèm 'tệp' được chỉ định làm cơ sở dữ liệu mới. Các chi tiết được giải thích trong SQL Server 2005 Express Edition User Instances.

Quá trình tạo một thể hiện con là cực kỳ mong manh và khi nó phá vỡ kết quả cuộc gọi DB cuối cùng trong một lỗi thời gian ra khi mở kết nối. Trong trường hợp của bạn có vẻ như quá trình này bị gián đoạn trong một số trường hợp (khi bạn đến phần được bảo vệ của trang web). Tại sao nó phá vỡ, là rất khó đoán mà không có thông tin thích hợp. Xem số Các sự cố thường gặp trong bài viết được liên kết và xem liệu có áp dụng cho bạn hay không. Cũng kiểm tra sổ ghi sự kiện hệ thống cho bất kỳ thông báo nào tại sao các phiên bản con không thể khởi động hoặc nó không thể mở tệp MDF. Lưu ý rằng một lỗi phổ biến là yêu cầu cùng một tệp vật lý với AttachDBFilename dưới các thông tin xác thực khác nhau: mỗi thông tin xác thực sẽ bắt đầu cá thể 'con' của riêng nó và chỉ có một đầu tiên sẽ thành công trong việc đính kèm cơ sở dữ liệu mong muốn.

+0

Như tôi đã nói, tôi đang sử dụng SQL Server 2008, không phải là tệp MDF. Chuỗi kết nối của tôi không có AttachDBFilename trong đó. Nguồn dữ liệu = MYSERVER; Danh mục ban đầu = WebsiteDB; Id người dùng = MyUserID; Mật khẩu = MyPassword; –

+0

Zhaph đã giải thích lý do tại sao LocalSqlServer được sử dụng (ví dụ: thể hiện người dùng Express) –

+0

Chỉ vì tôi có tất cả các chi tiết từ các ý kiến;) –

0

tôi đã có cùng một mức độ sử dụng là do các dịch vụ cho máy chủ sql bị vô hiệu hóa. kiểm tra theo services.msc để xem dịch vụ sqlexpress có chạy không nếu nó kiểm tra xem bạn có cài đặt sql express trên maxhine

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