2010-06-23 35 views
21

Ứng dụng của tôi cho phép quản trị viên tạm ngưng/hủy tạm ngưng tài khoản người dùng. Tôi thực hiện điều này bằng mã sau:Đăng xuất theo lập trình một người dùng ASP.NET

MembershipUser user = Membership.GetUser(Guid.Parse(userId)); 
user.IsApproved = false; 
Membership.UpdateUser(user); 

Điều trên làm tốt để tạm ngừng người dùng nhưng không thu hồi phiên của họ. Do đó, người dùng bị treo có thể tiếp tục truy cập vào ứng dụng miễn là cookie phiên của họ vẫn còn. Mọi sửa chữa/

Trả lời

2

Trên một số trang phổ biến, hãy kiểm tra xem tài khoản có hợp lệ không và nếu tài khoản bị thu hồi, hãy gọi Session.Abandon().

Sửa (Chỉ cần nhận thấy điều này vẫn còn mở cửa.)

Tôi biết điều này, bởi vì tôi làm điều đó.

Trên trang chính, hãy kiểm tra trạng thái tài khoản. Điều đó có nghĩa là trên mọi điều hướng bạn có cơ hội đăng xuất chúng.

(Final) Sửa

Đừng nghĩ về nó như "Tôi chấm dứt phiên họp của họ", nghĩ về nó như "phiên của họ chấm dứt riêng của mình."

+1

Điều này không chỉ dành cho phiên của người dùng hiện tại? Tôi muốn từ bỏ phiên của người dùng khác ... Một cái gì đó như Session (người dùng) .Abandon. – Testing123

+1

@ Testing123 egrunin có nghĩa là mọi người dùng sẽ kiểm tra xem tài khoản của họ có hợp lệ hay không, nếu có, thì ứng dụng sẽ xóa cookie của họ. – guanome

+0

Downvote vì bạn cần FormsAuthentication.SignOut(); – Juan

6

Nếu sử dụng hình thức xác thực:

FormsAuthentication.SignOut(); 
+3

Họ đang muốn kết thúc một phiên khác không phải là phiên của người dùng hiện tại, do đó, điều này không phù hợp –

24

Không có cách nào để từ bỏ một phiên làm việc từ phiên 'bên ngoài' này. Bạn sẽ phải kiểm tra cơ sở dữ liệu trên mỗi lần tải trang và nếu tài khoản đã bị vô hiệu hóa, thì hãy đăng xuất. Bạn có thể đạt được điều này bằng cách sử dụng một HttpModule quá, mà sẽ làm cho mọi thứ sạch hơn một chút.

Ví dụ:

public class UserCheckModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute); 
    } 

    public void Dispose() {} 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     // Get the user (though the method below is probably incorrect) 
     // The basic idea is to get the user record using a user key 
     // stored in the session (such as the user id). 
     MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"])); 

     // Ensure user is valid 
     if (!user.IsApproved) 
     { 
      HttpContext.Current.Session.Abandon(); 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled"); 
     } 
    } 
} 

Đây không phải là một ví dụ hoàn chỉnh, và các phương pháp lấy người dùng sử dụng một phím được lưu trữ trong phiên sẽ cần phải được điều chỉnh, nhưng điều này sẽ giúp bạn bắt đầu. Nó sẽ liên quan đến kiểm tra cơ sở dữ liệu bổ sung trên mỗi lần tải trang để kiểm tra xem tài khoản người dùng vẫn hoạt động, nhưng không có cách nào khác để kiểm tra thông tin này.

+0

Trên dòng 'MembershipUser user = Membership.GetUser (Guid.Parse (HttpContext.Current.Session [" guid "]));', bạn có nghĩa là chúng ta nên thay thế dòng này bằng bất kỳ phương pháp nào chúng tôi đang sử dụng để có được người dùng? Giống như một cuộc gọi đến cơ sở dữ liệu? – guanome

+0

@guanome Đúng vậy, vâng. Ví dụ mã ở trên giả định rằng bạn đang lưu trữ ID người dùng trong phiên. Mục đích của dòng mã này là sử dụng một giá trị được lưu trữ trong phiên để lấy người dùng từ cơ sở dữ liệu (như ID của họ) để bạn có thể kiểm tra trạng thái của họ. – Mun

2

Khi bạn đăng xuất người dùng, bạn cũng nên ghi đè lên FormsAuthenticationTicket.

HttpContext context = HttpContext.Current; 

//overwrite the authentication cookie 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString()); 
string encrypted_ticket = FormsAuthentication.Encrypt(ticket); 

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket); 
cookie.Expires = ticket.Expiration; 
context.Response.Cookies.Add(cookie); 

//clear all the sessions 
context.Session.Abandon(); 

//sign out and go to the login page 
FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 
Các vấn đề liên quan