7

Tôi có một ứng dụng web mà tôi đã tạo bằng cách sử dụng Mã khung thực thể đầu tiên. Khi thiết lập nó, tôi đã quản lý để kết hợp chuỗi kết nối DB của mình với DBContext bằng cách chỉ định không gian tên đầy đủ và lớp của DBContext làm tên của chuỗi kết nối.Mã khung thực thể Đầu tiên bỏ qua chuỗi kết nối, sử dụng IIS thay vì

<add name="MyClassProject.EfDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=true;User Id=MyUsername;Password=MyPassword;" providerName="System.Data.SqlClient"/> 

Ban đầu khi tôi thiết lập dự án, tôi vừa tạo nó trong c: \ inetpub \ wwwroot và chỉ chạy nó qua Visual Studio. Mọi thứ đều ổn.

Bây giờ tôi đang cố gắng để có mã xây dựng vào một thư mục trang web riêng biệt và có trang web chạy dưới dạng trang web và ứng dụng riêng trong IIS. Tôi đã thiết lập trang web và tệp máy chủ của mình nhưng khi tôi chạy nó, tôi đã nhận được lỗi sau.

Không thể mở cơ sở dữ liệu "MyDatabase" do thông tin đăng nhập yêu cầu. Đăng nhập thất bại.

Đăng nhập không thành công cho người dùng 'IIS APPPOOL \ MyAppPool'.

Tôi tự hỏi tại sao điều này xảy ra, vì dường như tôi đang chỉ định tên người dùng và mật khẩu bảo mật để sử dụng cho DB trong chuỗi kết nối của mình .... vậy tại sao lại cố gắng kết nối với ứng dụng trang web của tôi đang hoạt động?

Ngoài ra, làm thế nào tôi có thể sửa lỗi này, mà không cần phải cung cấp cho MyAppPool (hoặc dịch vụ mạng nếu tôi thay đổi nó để đó) DB quyền trong SQL Server?

Cập nhật: tôi nên đã nói rằng tôi khởi lớp DBContext tôi sử dụng:

namespace MyClassProject 
{ 
    public class EfDbContext : DbContext 
    { 
     public EfDbContext() : base ("MyDatabase") 
     { 
     } 
    } 
} 

Trả lời

3

Di Integrated Security=true;. Đó là cài đặt chuyển người dùng hiện tại.

+0

Tôi đã xóa thuộc tính đó khỏi chuỗi kết nối nhưng vẫn gặp sự cố tương tự. Tôi thậm chí đã cố gắng thiết lập một cách rõ ràng Integrated Security = false; nhưng điều đó cũng không hiệu quả. –

+1

@SeanHolmesby bạn có chắc chắn sử dụng chuỗi kết nối đó không? –

+0

Khi tôi chạy qua Visual Studio (khi nó hoạt động) nó chắc chắn thêm dữ liệu vào cơ sở dữ liệu mà tôi đang cố gắng tham khảo. tôi có: - namespace MyClassProject { public class EfDbContext: DbContext { EfDbContext công cộng() : cơ sở ("MyDatabase") {} }} ...... Và sau đó ......

3

Tôi đã tìm thấy sự cố. Khi tôi khởi tạo lớp DBContext của mình với : base("MyDatabase"), nó ghi đè chuỗi kết nối được chỉ định trong web.config.

Xóa nó khỏi lớp DBContext của tôi, với cơ sở dữ liệu đã tồn tại, trang web hiện hoạt động trong IIS. Tuy nhiên, nếu tôi chưa tạo cơ sở dữ liệu, (hoặc nếu tôi có bộ khởi tạo cơ sở dữ liệu của mình, hãy sử dụng DropCreateDatabaseWhenModelChanges hoặc DropCreateDatabaseAlways để nó cần tạo lại DB), trình khởi tạo sẽ không thành công vì nó sẽ cố gắng sử dụng một người dùng SQL không có quyền tạo DB.

Cách của tôi xung quanh nó là sử dụng : base("MyDatabase") và chạy từ Visual Studio ban đầu để cơ sở dữ liệu được tạo. Sau đó, loại bỏ nó khỏi mã, thêm người dùng được chỉ định vào bảo mật DB trong SQL Server, và nó sẽ cho phép trang web của tôi chạy trong IIS sau đó.

+1

'cơ sở (" MyDatabase ")' có nghĩa là tên chuỗi kết nối từ Web.config. Vì vậy, bạn chỉ cần có chuỗi kết nối khác nhau cho các điểm triển khai khác nhau. Hoặc đặt tên cơ sở khác nhau về điều kiện. – abatishchev

0

Bạn có thể sử dụng Web.config Transform để có kết nối cục bộ khác với điều khiển từ xa (nói ở chế độ Phát hành). Để bắt đầu sử dụng, bạn cần xuất bản Ứng dụng web của mình bằng cách sử dụng One-Click Publish từ Visual Studio. Đó thực sự là cách rất tiện dụng để xuất bản ứng dụng web!

Có vẻ như đó là những gì bạn đang tìm kiếm.


Hoặc thiết lập chuỗi kết nối tên cơ sở trên một điều kiện:

public EfDbContext() : base (GetConnectionStringName()) 
{ 
} 

private static GetConnectionStringName() 
{ 
    return RunLocally() : "LocalDatabase" : "RemoteDatabase"; 
} 

private static bool RunLocally() 
{ 
    // implement some how 
} 
1

Khi sử dụng an ninh tích hợp, DB được đưa ra một mã thông báo từ người dùng hiện đang chạy tiến trình. Trong mọi khả năng, bạn chạy Visual Studio từ tài khoản người dùng của bạn, có khả năng có quyền quản trị trên phiên bản SQL Server của bạn.

Khi IIS chạy ứng dụng của bạn, nó sử dụng một cái gì đó được gọi là Hồ bơi ứng dụng (hoặc Hồ bơi ứng dụng). Bạn có thể có nhiều ứng dụng trong một hồ bơi duy nhất để được quản lý cùng nhau. Hồ bơi ứng dụng cũng chạy trong tài khoản người dùng đặc biệt được đặt tên cho nhóm. Người dùng ứng dụng nhóm tồn tại trong một vùng chứa có tên là "IIS AppPool", vì vậy người dùng cục bộ cho DefaultAppPool là IIS AppPool\DefaultAppPool. Nếu bạn muốn cấp quyền truy cập vào tài nguyên trên hệ thống cục bộ của mình (bao gồm quyền đối với tệp), bạn cũng có thể cấp quyền truy cập cho người dùng nhóm ứng dụng hoặc nhóm địa phương IIS_IUSRS để cấp cho tất cả các hồ bơi ứng dụng.

Hãy nhớ rằng đây là những tài khoản cục bộ, vì vậy chúng sẽ không vượt qua ranh giới mạng. Để cấp quyền trên một máy chủ khác, bạn cần phải sử dụng người dùng miền (hoặc thậm chí tốt hơn, một Tài khoản dịch vụ được quản lý miền) hoặc bạn có thể đặt người dùng ứng dụng thành dịch vụ NETWORK và sau đó bạn có thể cấp quyền cho MyDomain\MyWebServer$ (ký hiệu đô la là quan trọng).

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