9

Próbuję użyć FormsAuthentication i działa dobrze w tym momencie z nazwą użytkownika i hasłem. Potrzebuję dodać rolę użytkownika do biletu uwierzytelniania formularzy i nie używam członkostwa ASP.NET.FormsAuthentication Role bez członkostwa

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

Jakiego mechanizmu używasz teraz do pracy z rolami? –

+0

@HuseinRoncevic Na mojej tabeli bazy danych mam UserName, hasło i rolę dla użytkownika. Chcę przekazać Rola pobraną z tabeli bazy danych do biletu Uwierzytelniania – chamara

+0

Nie jestem pewien, czy działa w ten sposób. Umieszczasz tylko nazwę użytkownika w pliku cookie auth, a następnie dla każdego przychodzącego żądania odczytujesz nazwę użytkownika z pliku cookie auth i ładujesz inne dane z bazy danych. Można to zrobić w "ActionFilter". – Suhas

Odpowiedz

20

FormsAuthenticationTicket konstruktor (jeden z wielu parametrów) posiada userData parametr, który zaczyna się łańcuch. To tutaj możesz dodawać swoje role, oddzielone przez jakąś postać, taką jak fajka (|) lub hash. Sposób, w jaki planujesz skorzystać, zależy od Ciebie. To, co normalnie robisz, to zarejestrować zdarzenie AuthenticateRequest. Tak, można utworzyć bilet ten był następujący:

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

Potem w global.asax byś zrobił coś takiego:

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

teraz masz role w obiekcie IPrincipal (HttpContext.Current.User) i kiedy frazę HttpContext.Current.User.IsUserInRole("RoleName") otrzymasz prawdę lub fałsz. W ten sposób powinieneś być w stanie uniknąć używania dostawcy Roles.

AKTUALIZACJA: Lepsze zdarzenie, z którym należy nawiązać połączenie, aby móc odtworzyć odtwarzanie Główny użytkownik to Application_AuthenticateRequest zamiast BeginRequest. Zaktualizowałem kod, aby to odzwierciedlić.

+3

Dobra odpowiedź, chociaż spowoduje to zgłoszenie zerowego odwołania, jeśli użytkownik nie jest uwierzytelniony. Użyj 'base.PostAuthenticateRequest + = OnAfterAuthenticateRequest;' zamiast – Burjua

+1

Dobra odpowiedź. Ale jeśli używasz standardowego FormsAuthorization, nie musisz ponownie odszyfrowywać biletu ... możesz po prostu powiedzieć 'var decodedTicket = ((FormsIdentity) HttpContext.Current.User.Identity) .Ticket;' – kape123

+0

Nie próbowałem to głównie dlatego, że szyfrowałem bilet. Jednak dam mu szansę. Dzięki. –