2015-05-01 22 views
10

Obecnie pracuję nad aplikacją ASP.Net MVC 5 z bazą danych serwera MS Sql. Muszę zaimplementować uwierzytelnianie i autoryzację w oparciu o tożsamość ASP.Net 2.0. Właśnie zapoznałem się z podstawowymi koncepcjami Tożsamości i spróbowałem wdrożyć to samo w mojej aplikacji. Ponieważ baza danych jest już zdefiniowana, muszę trochę dostosować Tożsamość. Kiedy spojrzałem na bazę danych, tabele są trochę inne niż te, które normalnie znalazłem w przykładowych projektach tożsamości.Niestandardowe uwierzytelnianie i autoryzacja w oparciu o uprawnienia użytkownika

enter image description here

z obrazka widać, że istnieje tabela o nazwie grupa i zdefiniowane użytkownik zestaw praw do nich na podstawie modułu. Te same uprawnienia będą domyślnie dostępne dla użytkownika. Jeśli chcesz zmienić jakiekolwiek prawa, możesz je przesłonić, ustawiając uprawnienia w tabeli Prawa użytkownika.

Moje pierwsze pytanie brzmi: ASP. Czy tożsamość sieciowa z niestandardową autoryzacją i autoryzacją jest właściwą metodą do wdrożenia takiego scenariusza?

Z perspektywy widoku, muszę wygenerować menu oparte na prawach użytkownika/użytkownika, a także chcę włączyć/wyłączyć przyciski na ich podstawie. Udało mi się wygenerować menu na podstawie wartości bazy danych. Ale muszę autoryzować każde żądanie klienta i do tego myślę, że AuthorizeAttribute jest najlepszą opcją. Proszę zasugeruj? Wszelkie dobre wzorce projektowe lub post są doceniane.

Odpowiedz

17

Pewnie Identity tak potężny i elastyczny, że można go dostosować. Użyj prawo użytkownika jako roszczenie następnie napisać dostosowanych AuthorizeAttribute aby sprawdzić roszczeń na przykład rozważyć ten kod:

[HttpPost] 
public ActionResult Login(string username, string password) 
{ 
    if (_userManager.IsValid(username, password)) // your own user manager 
    { 
     var ident = new ClaimsIdentity(
      new[] 
      { 
       // adding following 2 claim just for supporting default antiforgery provider 
       new Claim(ClaimTypes.NameIdentifier, username), 
       new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"), 

       new Claim(ClaimTypes.Name, username), 
       // populate assigned user rightID's form the DB and add each one as a claim 
       new Claim("UserRight","FirstAssignedUserRightID"), 
       new Claim("UserRight","SecondAssignedUserRightID"), 
      }, 
      DefaultAuthenticationTypes.ApplicationCookie); 

     HttpContext.GetOwinContext().Authentication.SignIn(
      new AuthenticationProperties { IsPersistent = false }, ident); 
     return RedirectToAction("MyAction"); // auth succeed 
    } 
    // invalid username or password 
    ModelState.AddModelError("", "invalid username or password"); 
    return View(); 
} 

i napisać roszczenia opartego atrybut zezwolić na:

public class ClaimsAccessAttribute : AuthorizeAttribute 
{ 
    // in the real world you could get claim value form the DB, 
    // I simplified the example 
    public string ClaimType { get; set; } 
    public string Value { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     return context.User.Identity.IsAuthenticated 
      && context.User.Identity is ClaimsIdentity 
      && ((ClaimsIdentity)context.User.Identity).HasClaim(x => 
       x.Type == ClaimType && x.Value == Value); 
    } 
} 

Na koniec wystarczy aby dodać atrybut do swoich działań:

[ClaimsAccess(CliamType="UserRight",Value="YourRightID"] 
public ActionResult MyAction() 
{ 
    // also you have access the authenticated user's claims 
    // simply by casting User.Identity to ClaimsIdentity 
    // ((ClaimsIdentity)User.Identity).Claims 
} 

pominąłem grupa użytkowników, aby uprościć przykład i również ja sztywno kilka części, które musisz nakaz e dostawca do pobrania z DB.

Powiązane problemy