2016-10-27 52 views
6

Chciałbym wdrożyć autoryzację opartą na rolach w mojej aplikacji internetowej, którą buduję. Sposób, w jaki sobie wyobrażałem, aby ten jest stworzenie 3 tabel w moim DB jak następuje:Wdrażanie autoryzacji opartej na rolach przy użyciu .NET MVC 5

1. Roles 
2. UserRoles (many to many table) 
3. Users 

Po że każdy użytkownik będzie miał rolę przypisaną do niego. Teraz ... Moje pytanie brzmi: Jak zezwolić lub zabraniać dostępu do określonych widoków/kontrolerów w mojej aplikacji .NET MVC. Ja natknęliśmy się na to:

[Authorize(Roles = "HrAdmin, CanEnterPayroll")] 
[HttpPost] 
public ActionResult EnterPayroll(string id) 
{ 
    // . . . Enter some payroll . . . 
} 

Obiekt autoryzacji wydaje się być ograniczenie specyficznych controllers/działań do konkretnych ról ... Ale co, jeśli czytam role użytkownika z UserRoles stołowych jak w moim przypadku ?? W jaki sposób moja aplikacja będzie wiedzieć, jaką rolę ma użytkownik w systemie?

Czy ktoś może mi w tym pomóc?

+0

Czy sprawdziłeś [tożsamość ASP.NET] (https://www.asp.net/identity)? – SeM

+0

Musisz dodać Roszczenia ze swoimi rolami w swojej metodzie "Login()". – SeM

+0

Powyższe jest już zaimplementowane w środowisku tożsamości wbudowanym w MVC5. Nie musisz się martwić o samodzielne tworzenie tych tabel, wystarczy zmienić domyślny ciąg połączenia i wskazać go na serwerze. – uk2k05

Odpowiedz

7

pozwala udawać zapisaniu swoją nazwę użytkownika i role w Sesja:

[AllowAnonymous] 
[HttpGet] 
public ActionResult Login() 
{ 
    . . . . 

    string userName = (string)Session["UserName"]; 
    string[] userRoles = (string[])Session["UserRoles"]; 

    ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie); 

    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userName)); 

    userRoles.ToList().ForEach((role) => identity.AddClaim(new Claim(ClaimTypes.Role, role))); 

    identity.AddClaim(new Claim(ClaimTypes.Name, userName)); 

    AuthenticationManager.SignIn(identity); 

    . . . . 
} 
+0

Doskonały przykład, wielkie dzięki! :) – User987

+0

Nie ma za co :) – SeM

+0

Próbowałem już tej metody, ale mówi, że klasa AuthenticationManager nie zawiera metody SignIn z jakiegoś powodu:/ – User987

1

Jeśli autoryzujesz rolę w celu uzyskania dostępu do kontrolera (na poziomie klasy) lub akcji (poziomu funkcji), role będą miały dostęp. w przeciwnym razie odmowa dostępu.

jeśli użyjesz tylko słowa kluczowego Autoryzuj bez określania ról lub użytkowników, wszyscy uwierzytelnieni użytkownicy będą mieli dostęp.

Mam nadzieję, że wszystko wyjaśniam?

używać roszczeń tożsamości oparte zapoznać się z poniższym

https://msdn.microsoft.com/en-gb/library/ee517291.aspx

https://msdn.microsoft.com/en-gb/library/ff359101.aspx

to jest na podstawowych

What is the claims in ASP .NET Identity

+0

Tak, rozumiem cię. Kwestią tutaj jest, w jaki sposób dodać role z mojego DB, aby aplikacja wie, jaką rolę ma użytkownik z DB. @SeM powiedział, że mogę to zrobić z czymś zwanym "Roszczenia" ... Czy to właściwa droga? – User987

+0

tak twierdzenie oparte jest sposobem, mam zmodyfikowany mój odpoczynek z kilkoma linkami, które mogą pomóc – Emil

0

Oto niektóre fragmenty kodu, w jaki sposób można to osiągnąć przy użyciu usługi Azure Active Directory. Konfigurowanie aplikacji w Startup.cs:

public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 

    app.UseIISPlatformHandler(); 
    app.UseStaticFiles(); 

    app.UseCookieAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
    });    

    app.UseOpenIdConnectAuthentication(options => 
    { 
     options.AutomaticChallenge = true; 
     options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId"); 
     options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common"; 
     options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 

     options.TokenValidationParameters = new TokenValidationParameters 
     { 
      ValidateIssuer = false, 
      RoleClaimType = "roles" 
     }; 
     options.Events = new OpenIdConnectEvents 
     { 
      OnAuthenticationValidated = (context) => Task.FromResult(0), 
      OnAuthenticationFailed = (context) => 
      { 
       context.Response.Redirect("/Home/Error"); 
       context.HandleResponse(); // Suppress the exception 
       return Task.FromResult(0); 
      }, 
      OnRemoteError = (context) => Task.FromResult(0) 
     }; 
    }); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");     
    }); 

    DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait(); 
} 

I tu jest użycie:

[Authorize(Roles = "SuperAdmin, Worker")] 
public ActionResult Index() 
{ 
    ViewBag.Message = "Hello"; 
    return View(); 
} 

oraz:

public ActionResult Submit(FormCollection formCollection) 
{ 
    if (User.IsInRole("SuperAdmin") || User.IsInRole("Worker")) 
    { 
     ... 
    } 

    if (User.IsInRole("Admin")) 
    { 
     //do some admin tasks 
    } 

    return RedirectToAction("Index", "Tasks"); 
} 

Oto mój post na blogu, że: http://www.eidias.com/blog/2016/1/16/using-azure-active-directory-application-roles. Znajdziesz tam, jak skonfigurować powyższe role w AAD.