2010-01-24 19 views
7

Tôi đã triển khai xác thực tùy chỉnh trong ASP.NET MVC. Nếu người dùng hợp lệ cố gắng đăng nhập, tôi đặt HttpContext.User = user trong phương thức Đăng nhập của AccountController. Nhưng nó vẫn ở đó chỉ cho yêu cầu. Làm thế nào tôi có thể đặt nó cho phiên?Đặt HttpContext.User cho phiên

Tôi đã sử dụng phương án thay thế, đặt HttpContext.Session["CurrentUser"] = user. Nếu tôi muốn xem phiên có được ủy quyền không, tôi phải kiểm tra xem HttpContext.User != null. Nhưng, tôi không muốn để lộ logic xác thực ở khắp mọi nơi trong ứng dụng. Nếu tôi cần thay đổi điều đó, nó sẽ lộn xộn.

Vui lòng giúp tôi giải quyết vấn đề này. Một giải pháp có thể được điền vào thuộc tính HttpContext.User của mọi yêu cầu với giá trị là HttpContext.Session["CurrentUser"] ngay từ đầu nhưng tôi không biết cách thực hiện.

Trả lời

11

Viết phương pháp sau đây trong lớp ứng dụng của Global.asax

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    HttpContext.Current.User = HttpContext.Session["CurrentUser"]; 
} 

hoặc bạn có thể sử dụng "tài khoản" tài sản của System.Web.Mvc.Controller được thừa hưởng để điều khiển của bạn (lưu ý: hãy chắc chắn để gọi phương thức FormsAuthentication.SetAuthCookie khi xác thực thành công đăng nhập người dùng của bạn).

+0

Tương đương với điều này trong '.Net Core' là gì? –

+0

Tôi cũng bị kẹt trong cùng một vấn đề trong lõi .net. Tôi đang cố gắng từ nhiều ngày nhưng không tìm thấy bất kỳ giải pháp xác thực nào. Vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ giải pháp nào. – Saif

6

Cách tốt nhất để thực hiện việc này là viết mô-đun xác thực tùy chỉnh và móc mô-đun vào ứng dụng của bạn. Mô-đun này sẽ thực hiện trước bất kỳ yêu cầu nào và sẽ có cơ hội thiết lập thuộc tính HttpContext.User khi thích hợp.

Ví dụ: hãy xem xét mô-đun Xác thực biểu mẫu. Trước khi trình xử lý HTTP của bạn chạy (có thể là trang .aspx, đường dẫn MVC, v.v.), nó có cơ hội chặn yêu cầu. Nó đọc giá trị của một cookie đăng nhập, giải mã và xác minh giá trị cookie được mã hóa và đặt HttpContext.User nếu kiểm tra vượt qua. Bằng cách đó, khi trình xử lý chạy và thực sự xử lý yêu cầu, thuộc tính Người dùng đã được đặt chính xác. Cuối cùng, điều này sẽ giống như là bạn không cần thuộc tính ủy quyền tùy chỉnh trên ASP.NET, vì thuộc tính [Authorize] đã được cung cấp trong hộp sẽ hoạt động tự động với mô-đun xác thực tùy chỉnh của bạn. Tuy nhiên, phương thức AccountController.LogOn() của bạn (hoặc bất kỳ thứ gì bạn sử dụng thay cho điều này) sẽ cần phải liên lạc với nhà cung cấp xác thực thích hợp để tạo ra mã thông báo sẽ được xác thực bởi mô-đun xác thực. Đây sẽ là nơi duy nhất bạn cần viết mã khác với mã được cung cấp trong hộp.

Xem http://social.msdn.microsoft.com/Search/en-US?query=http%20moduleshttp://social.msdn.microsoft.com/Search/en-US?query=custom%20authentication%20asp.net để biết thêm thông tin.

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