15

Tôi vừa tải xuống phiên bản VS 2012 cùng với ASP.NET 4.5 và MVC 4.0 và đang khởi động lốp xe bằng ứng dụng mẫu và thấy rằng xác thực biểu mẫu hoạt động hoàn hảo với ASP.NET 4.0/MVC 3 dường như không còn hoạt động với bản phát hành mới nhất.Nâng cấp lên ASP.NET 4.5/MVC 4 hình thức xác thực không thành công

Khi tôi thực hiện một cuộc gọi đến chức năng Đăng nhập vào bộ điều khiển hành động, cuộc gọi WebSecurity.Login thất bại:

public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) 
    { 
     return RedirectToLocal(returnUrl); 
    } 

    // If we got this far, something failed, redisplay form 
    ModelState.AddModelError("", "The user name or password provided is incorrect."); 
    return View(model); 
} 

tôi đã thay thế mã này bằng tương đương nguồn VS 2010 của tôi, và đó cũng không thành công (sử dụng chức năng FormsAuthentication.Authenticate hiện không được chấp nhận).

Câu hỏi của tôi là: Có ai đã chuyển một ứng dụng MVC3 sang MVC4 và tìm thấy giải pháp cho sự cố này không? Tôi đang sử dụng IIS Express, vì vậy tôi đoán rằng có thể gây ra một số vấn đề bằng cách nào đó, nhưng nếu bạn có bất kỳ ý tưởng, tôi sẽ đánh giá cao nó.

tôi sao chép cấu hình của tôi từ asp.net làm việc ứng dụng 4/MVC3 của tôi như sau, nhưng không có may mắn (đây là phần có liên quan):

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=tcp:sql2k1201.dbprovider.net;Initial Catalog=SQL2012_db;User ID=SQL2012_db_user;Password=dbpassword;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 

    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="2880"/> 
    </authentication> 

    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection" 
      enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
      maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
      applicationName="/" /> 
     </providers> 
    </membership> 

    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DefaultConnection" applicationName="/" /> 
     </providers> 
    </profile> 

    <roleManager enabled="true"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="/" /> 
     </providers> 
    </roleManager> 

Trả lời

3

Vấn đề ở đây là mặc định mvc4 mẫu internet đang sử dụng SimpleMembership để quản lý thành viên/vai trò thông tin. Mã trong khuôn mẫu có giả định về điều này và chỉ có thể làm việc với simplemembership. Khi bạn cài đặt các nhà cung cấp phổ, mã bộ điều khiển tài khoản sẽ phát sinh vì nó không thể hiểu được các nhà cung cấp phổ dụng. Hãy xem bài đăng này giải thích thêm về trường hợp này http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

+0

Pranav - cảm ơn vì đã chỉ ra bài viết đó. Tôi nhận thấy rằng vô số nhận xét về bài viết đã đề cập rằng các nhà cung cấp mới là bất cứ điều gì nhưng đơn giản và không có đường dẫn di chuyển trơn tru nếu bạn muốn chuyển đổi thành viên/vai trò hiện có sang giản đồ mới. Dường như với tôi trong khi họ có thể đã cố gắng đơn giản hóa một hệ thống phức tạp, họ đã làm cho nó nhiều hơn thế, và chỉ thử những thứ mới bằng cách thay đổi nhanh chóng kết quả web.config trong các bảng mới không hoạt động với thiết lập trước. Tôi chắc chắn sẽ tìm hiểu thêm về điều này! –

2

Đối với tôi, tôi đã có một vấn đề bởi vì có một số thay đổi các thiết lập web.config bạn cần (từ http://www.asp.net/whitepapers/mvc4-release-notes)

<appSettings> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="PreserveLoginUrl" value="true" /> 
</appSettings> 

Sửa các thiết lập (mà nó không giống như bạn đã thêm) có điều làm việc cho tôi khi tôi đã có vấn đề đăng nhập.

+0

Web.config mà tôi đưa vào chỉ là một đoạn trích có thay đổi mà tôi đã thêm để xác thực biểu mẫu. Khóa/giá trị bạn có ở trên nằm trong web.config mặc định và tôi đã không xóa chúng (trong web.config đầy đủ của tôi). Cảm ơn bạn đã trả lời. –

+0

Tôi vừa xem qua cuộc gọi tới 'WebSecurity.InitializeDatabaseConnection ("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);' và nhìn vào bảng "UserProfile" trong DB của tôi và nó trống. Họ có thay đổi giản đồ không? Khi tôi đi đến "ASP.net trang web cấu hình" công cụ, nó cho thấy người dùng của tôi, nhưng các ứng dụng vẫn sẽ không cho phép tôi đăng nhập. –

+0

Cảm ơn ... PreserveLoginUrl là chìa khóa cho vấn đề của tôi.Đăng nhập đã hoạt động tốt nhưng khi sử dụng [Authorize (Roles = "admin")] nó đã thất bại. – RonnBlack

34

Nếu vé xác thực biểu mẫu của bạn cần được chia sẻ giữa các ứng dụng sử dụng phiên bản .NET framework cũ hơn, bạn phải định cấu hình .NET 4.5 ứng dụng của mình một cách rõ ràng để sử dụng các chế độ tương thích máy trước đó hoặc chúng sẽ không thể mã hóa/giải mã vé xác thực biểu mẫu.

Trong web.config .net 4.5 ứng dụng của bạn, thiết lập các thuộc tính chế độ tương thích:

<system.web> 
<machineKey compatibilityMode="Framework20SP2" /> 
</system.web> 

này sẽ cho phép NET 4.5 ứng dụng của bạn để làm việc với vé các hình thức xác thực được tạo ra bởi phiên bản trước NET.

Lưu ý: Nếu bất kỳ máy chủ nào của bạn chưa cài đặt .NET Framework 2.0 SP2, bạn sẽ cần đặt chế độ tương thích thành "Framework20SP1" thay thế.

MSDN - MachineKeySection.CompatibilityMode Property

+0

James - Tôi đã thử đề xuất của bạn ngay bây giờ và dường như không tạo ra bất kỳ sự khác biệt nào và tôi không thể đăng nhập. Bạn có nghĩ rằng nó có liên quan gì đến IIS Express không? –

+3

Cài đặt này áp dụng cho cả IIS và IIS Express. Vì bạn đang chia sẻ vé xác thực biểu mẫu, bạn có thể thử các cài đặt sau cũng như bên dưới . –

+1

James, cảm ơn bạn rất nhiều - bạn đã giải quyết được vấn đề của mình trong câu hỏi này http://stackoverflow.com/questions/11532743/mvc-4-authorize-attribute-not-recognizing-forms-auth-from-asp-net- 3-5 –