2010-06-23 20 views
21

Uygulamam, bir yöneticinin kullanıcı hesaplarını askıya almasına/askıya almasına izin verir. Aşağıdaki kod ile bunu:Bir ASP.NET kullanıcısı programsal olarak oturum kapatma

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

kullanıcıyı askıya ince yukarıdaki çalışır, ancak bu onların oturumu iptal etmez. Sonuç olarak, askıya alınan kullanıcı, oturum çerezleri kaldığı sürece uygulamaya erişim sağlayabilir. Düzeltme/

cevap

2

Bazı ortak sayfalarda, hesabın geçerli olup olmadığını kontrol edin ve iptal edilmişse, Session.Abandon() numaralı telefonu arayın.

Düzenleme (Sadece bu hala açık olduğunu fark ettim.) Bunu yapmak için

Ben, bu işleri biliyorum.

Ana sayfada, hesap durumunu kontrol edin. Bu, numaralı tüm navigasyonlarda anlamına gelir.

(Final) Düzen

olarak düşünmek "Ben, onların oturumu sonlandırma ediyorum" olarak düşünmek etmeyin "oturum kendini sonlandırır."

+1

Bu yalnızca geçerli kullanıcı oturumu için değil mi? Başka bir kullanıcının oturumunu bırakmak istiyorum ... Oturum (kullanıcı) .Abandon gibi bir şey. – Testing123

+1

@ Testing123 egrunin, her kullanıcının kendi hesabının geçersiz olup olmadığını kontrol etmesinin gerektiği anlamına gelir, öyleyse uygulama çerezlerini kaldırır. – guanome

+0

Downvote FormsAuthentication.SignOut(); – Juan

6

Eğer form kimlik doğrulaması kullanarak: 'dışında' oturumdan bir oturumu iptal yolu yoktur

FormsAuthentication.SignOut(); 
+3

Geçerli kullanıcının değil başka bir oturumu sonlandır, bu yüzden uygun değil –

24

bu. Her sayfa yüklemesinde veritabanını kontrol etmeniz ve hesabın devre dışı bırakılması durumunda oturum açmanız gerekir. Bunu bir HttpModule kullanarak da başarabilirsiniz, bu da işleri biraz daha temiz hale getirir. Örneğin

:

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"); 
     } 
    } 
} 

Bu tam bir örnek ve adapte edilmesi gerekecektir oturumda saklanan bir anahtar kullanılarak kullanıcı getirilirken yöntemi değildir, ancak bu başlangıç ​​almalısınız. Kullanıcı hesabının hala aktif olduğunu kontrol etmek için her bir sayfa yüküne ek bir veritabanı kontrolü eklenecektir, ancak bu bilgiyi kontrol etmenin başka bir yolu yoktur.

+0

"MembershipUser user = Membership.GetUser (Guid.Parse (HttpContext.Current.Session [" guid "])) satırında, demek istiyorsun Bu satırı, bir kullanıcı almak için kullandığımız herhangi bir yöntemle değiştirmeliyiz? Veritabanına bir çağrı gibi mi? – guanome

+0

@guanome Bu doğru, evet. Yukarıdaki kod örneği, kullanıcı kimliğini oturumda sakladığınızı varsayar. Bu kod satırının amacı, kullanıcının durumunu kontrol edebilmeniz için veritabanından (ID gibi) geri almak için oturumda saklanan bir değeri kullanmaktır. – Mun

2

Bir kullanıcı oturumu kapattığınızda, FormsAuthenticationTicket'un üzerine yazmak da iyi bir fikirdir.

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(); 
İlgili konular