2014-12-22 8 views
7

Obecnie pracujemy nad mniejszą aplikacją ASP.NET MVC 5 przy użyciu identyfikatora ASP.NET. Pozwala nam utrzymywać różne projekty i ich zadania. Niedawno wdrożyliśmy podstawowe uwierzytelnianie, dzięki czemu jesteśmy w stanie zarejestrować użytkownika w naszej witrynie i zalogować się z nim.Prawa wykonawcze za pomocą ASP.NET Identity

Chcemy być w stanie zarządzać prawami dostępu na podstawie projektu, abyśmy mogli powiedzieć każdemu użytkownikowi, że przeczytał, napisał, admin lub nie ma uprawnień do określonego projektu.

Moją pierwszą myślą było, że możemy stworzyć prostą nową tabelę w naszej bazie danych, która przechowuje prawa użytkownika. Ale czuję, że może istnieć wbudowany sposób osiągnięcia tego z ASP.NET Identity.

Moje pytanie brzmi więc, jaką ścieżką powinniśmy podążać - ręcznie budując nową tabelę, aby administrować prawami lub użyć czegoś wbudowanego dostarczonego przez ASP.NET Identity.

+0

Może ten artykuł pomoże Ci podjąć decyzję: http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/ –

+0

Ther nie jest wbudowaną koncepcją praw użytkownika w asp.net, ponieważ są one bardzo specyficzne dla aplikacji. Istnieje koncepcja ról użytkowników, która jest logiczną grupą użytkowników. Zwykle przypisuje się określoną liczbę zapisów użytkowników do roli. –

+0

Jeśli dobrze Cię rozumiem, sugerujesz utworzenie roli dla każdego ograniczenia dostępu (odczyt/zapis/admin) dla każdego projektu? – Thorakas

Odpowiedz

3

wykorzystanie coś wbudowaną dostarczone przez ASP.NET Identity

tylko rzeczy można użyć istnieją roszczenia lub role i obie nie są zbudowane na co chcesz IMO.

Więc pójdę z własnego stołu, który łączy projekt dla użytkownika, np .:

public class UserProjectRights 
{ 
    [Key] 
    public ApplicationUser User { get; set; } 
    [Key] 
    public Project Project { get; set; } 

    public AccessRight Right { get; set; } 
} 

Wówczas gdy robisz pewne działania gdzie wymagane jest szczególne uprawnienie trzeba sprawdzić za to. Istnieje kilka sposobów, w jaki możesz to zrobić. W mojej aplikacji stworzyłem „Prawo dostępu rozszerzenia wyboru” jak poniżej (I zdefiniowano wspólny interfejs dla wszystkich „Prawo dostępu podmiotów” do „ponownego wykorzystania” tej metody):

public static bool? CanView(this ApplicationUser user, Project project) 
{ 
    var userRight = project.Rights.FirstOrDefault(r => r.User == user); 
    return userRight == null ? (bool?)null : userRight.Right.HasFlag(AccessRight.View); 
} 

zakładając AccessRight jest enum jak:

[Flags] 
public enum AccessRight 
{ 
    View, 
    Edit, 
    Admin 
} 

Następnie można zrobić coś jak następuje w logice:

if (user.CanView(project) == true) 
{ 
    // show project 
} 

użyłem bool? więc mogę realizować różne „defau To zachowanie ", ponieważ wiem, że jeśli zwracane jest null, nie ma zdefiniowanego prawa.

+0

A następnie w każdym kontrolerze, który robi coś z jakimś projektem lub obiektem związanym z projektem, należy sprawdzić, czy użytkownik ma odpowiednie prawo do danego projektu (nadrzędnego). – CodeCaster

+0

'Jedynymi rzeczami, których możesz użyć, są roszczenia lub role, a obie nie są zbudowane dla tego, co chcesz IMO" - całkiem szczęśliwie użyłem oświadczeń wcześniej, aby zapewnić zachowanie "roli w projekcie", takie jak OP opisuje. – Rawling

+1

@ChrFin the last. Nie jesteś tam po prostu tworząc stół. W Twojej odpowiedzi nie jest to wymagane, ale OP i przyszli użytkownicy mogą być zdezorientowani. – CodeCaster

Powiązane problemy