9

FormsAuthentication'ı kullanmaya çalışıyorum ve şu anda kullanıcı adı ve parola ile çalışıyor. Form Kimlik Doğrulaması Biletine Kullanıcı Rolü eklemem gerekiyor ve ASP.NET Üyeliğini kullanmıyorum.FormsAuthentication Üyelik Rolleri

if (rep.CheckUser(model.UserName, model.Password,out UserRole))//Check User 
    { 

    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

// Roles.AddUserToRole(model.UserName, UserRole);//This Requires Membership 

    return Redirect(FormsAuthentication.DefaultUrl); 

} 
+0

Roller ile çalışmak için şimdi hangi mekanizmayı kullanıyorsunuz? –

+0

@HuseinRoncevic Veritabanı tablomda UserName, Password ve User için Kullanıcı Rolü var. Veritabanı tablosundan alınan Rolü Kimlik Doğrulama biletine iletmek istiyorum – chamara

+0

Bu şekilde çalıştığından emin değil. Kullanıcı adını yalnızca auth çerezine koydunuz ve her gelen istek için auth cookie'den kullanıcı adını okuyor ve diğer detayları veritabanından yüklüyorsunuz. Bu bir ActionFilter'da yapılabilir. – Suhas

cevap

20

FormsAuthenticationTicket yapıcı (çoğu parametrelerle bir) bir dize alır userData parametresi vardır. Buradaki rollerinizi, boru (|) veya karma gibi bir karakterle ayırarak ekleyebilirsiniz. Kullanmayı planladığın şey sana kalmış. Normalde yaptığınız şey, AuthenticateRequest etkinliğini kaydetmektir. Böyle bir şey yapacağını global.asax yılında Bundan sonra

private void CreateTicket() 
{ 
    var ticket = new FormsAuthenticationTicket(
      version: 1, 
      name: UserName, 
      issueDate: DateTime.Now, 
      expiration: DateTime.Now.AddSeconds(httpContext.Session.Timeout), 
      isPersistent: false, 
      userData: String.Join("|", arrayOfRoles)); 

    var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

    httpContext.Response.Cookies.Add(cookie); 
} 

: Yani, bu bir bilet yaratabilecek

public override void Init() 
{ 
    base.AuthenticateRequest += OnAuthenticateRequest; 
} 

private void OnAuthenticateRequest(object sender, EventArgs eventArgs) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     var decodedTicket = FormsAuthentication.Decrypt(cookie.Value); 
     var roles = decodedTicket.UserData.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries); 

     var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles); 
     HttpContext.Current.User = principal; 
    } 
} 

Şimdi IPrincipal nesnesinde rolleri (HttpContext.Current.User) varsa ve birlikte sorguladığınızda HttpContext.Current.User.IsUserInRole("RoleName") Doğru veya yanlış alacaksınız. Bu şekilde Roles sağlayıcısını kullanmamanız gerekir.

GÜNCELLEME: Yeniden oluşturma işleminin başlaması için aranacak daha iyi bir olay Kullanıcı yöneticisi, BeginRequest yerine Application_AuthenticateRequest şeklindedir. Kodu yansıtacak şekilde güncelledim.

+3

İyi yanıt, kullanıcı kimliği doğrulanmamışsa bu, boş başvuru istisnasını atar. 'Base.PostAuthenticateRequest + = OnAfterAuthenticateRequest;' yerine – Burjua

+1

İyi yanıtı kullanın. Ama eğer standart FormsAuthorization kullanıyorsanız o zaman tekrar şifresini çözmeniz gerekmiyor ... basitçe 'var decodedTicket = ((FormsIdentity) HttpContext.Current.User.Identity) .Ticket; ' – kape123

+0

Denemedim Bu çoğunlukla bileti şifrelediğim için. Ancak, ona bir şans vereceğim. Teşekkürler. –