2009-08-19 12 views
14

Ten projekt, nad którym pracuję, wymaga, żebym utrzymywał lokalną bazę użytkowników adminów i korzystał z zewnętrznego db dla zwykłych użytkowników. Każdemu, kto przejdzie uwierzytelnianie w db administracyjnym, należy przypisać rolę "admin", a każdemu uwierzytelnionemu przez inną bazę danych zawsze zostanie przydzielona rola "użytkownika".Jak ręcznie ustawić rolę użytkownika w ASP.NET MVC?

Czy mogę ręcznie przypisać te role? Nie potrzebuję złożoności dostawcy ról ani nic takiego, ponieważ używam tylko tych dwóch ról, które ZAWSZE będą oparte na tym, którego bazy danych uwierzytelniają.

Byłoby to OGROMNA pomoc, gdyby można było podać przykładowy kod lub link do niektórych dokumentów. Dzięki!

EDIT:

Obecnie nie używam dostawcy roli i tworząc jeden wydaje się być kłopotów. Wiem, że nie jest to "najlepsza praktyka", ale muszę tylko przypisać 1 z 2 ról podczas logowania (to się nigdy nie zmieni). Nie ma sensu również przechowywać informacji o rolach w bazie danych, ponieważ użytkownicy są już podzieleni na dwie role za pomocą swojej roli.

Oto niektóre pseudo-code:

if (AdminDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'admin'); 
} elseif (UserDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'user'); 
} else { 
    // Login failed. 
} 

Jego część 'ThisSession.AssociateUserWithRole' nie wiem. Zasadniczo jeden użytkownik jest uwierzytelniony, muszę powiedzieć .NET do której roli należy użytkownik.

Odpowiedz

15

Implementing a role provider nie jest szczególnie trudne - zwłaszcza, jeśli realizują tylko sprawdzanie ról, a nie zarządzania rolą. Wystarczy zaimplementować te fragmenty, które są potrzebne, a resztę rzucić w NotImplementedExceptions. Jeśli masz tylko jedną aplikację, nie musisz się zbytnio przejmować tą częścią. Zwróć uwagę, że potrzebna porcja będzie podyktowana przez strukturę, z której korzysta, a nie w jaki sposób go użyć. Myślę, że na przykład musisz zaimplementować bit, który zwraca wszystkie role użytkownika, nawet jeśli chcesz tylko sprawdzić, czy są one w określonej roli.

Powiedziawszy, możesz pominąć cały RoleProvider i zrobić całą rzecz w Sesji.W takim przypadku możesz zaimplementować własny numer AuthorizeAttribute i zastąpić go bitami uwierzytelniania i sprawdzania roli. Przechowuj rolę użytkownika w sesji po uwierzytelnieniu i sprawdź to za pomocą twojego atrybutu i parametrów podanych w atrybucie dla metody/klasy, którym ją udekorowałeś.

+0

Niestandardowy AuthorizeAttribute ma najbardziej sensowne dla mnie (noob MVC .NET z PHP-land). Dzięki za pomoc!! –

+0

Czy Twój sposób używania 'sesji' jest następujący: w login->' Session.Add ("LoggedInRole", "admin"); 'i kiedy potrzebuję bieżącego typu użytkownika, przeczytaj go z' Sesji'. Czy 'Session' jest wystarczająco bezpieczny, aby zapisać typ użytkownika (rolę) w nim? –

+1

@MajidR 'Session' jest zwykle po stronie serwera, więc nie jest mniej bezpieczny niż dostawca roli, z perspektywy intruzów. Musiałbyś oczywiście zakodować całą logikę, więc z punktu widzenia niezawodności będzie to zależało. Prawdopodobnie wybrałbym trasę 'RoleProvider'. – tvanfosson

6

Jeśli używasz członkostwa & role wbudowany w ASP.NET następnie spojrzeć na AddUserToRole i RemoveUserFromRole:

http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx

podstawie sposobu ich zalogować można dodawać i usuwać je w razie potrzeby.

Nie mogę stwierdzić z Twojego wpisu, jeśli nie używasz dostawcy roli lub mówisz, że nie chcesz tworzyć własnego dostawcy roli. Jeśli nie korzystasz z wbudowanego dostawcy roli, będziesz musiał użyć dowolnego mechanizmu kodowania, aby zmienić użytkownika przy logowaniu na podstawie tego, w jaki sposób/gdzie się loguje.

EDYCJA: Po wyświetleniu kodu i stwierdzeniu, że nie używasz silnika ról asp.net.

Używasz pliku cookie autorów formularzy, który pojawia się w ten sposób, aby nadpisać plik authenticateRequest pliku global.asax i ustawić role w razie potrzeby i utworzyć bilet.

Oto próbka w: http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

Próbka tylko „dostaje” ról, ale można dodać/zmienić role tutaj.

+0

myślę @ rozwiązanie tvanfosson byłaby najlepsza dla czego potrzebuję. Dzięki za pomoc! Doceniam to. –

1

Jeśli ktoś napotka ten sam problem z OWIN, myślę, że to może pomóc:

var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie"); 

if (<user is admin>) 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin")); 
else 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User")); 

HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult);