2016-10-27 12 views
6

Ich möchte eine rollenbasierte Autorisierung in meiner Webanwendung implementieren, die ich erstelle. Die Art, wie ich es mir vorgestellt, dies zu machen, ist 3 Tabellen in meiner DB erstellen wie folgt:Implementieren von rollenbasierter Autorisierung mit .NET MVC 5

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

Nach dass jeder Benutzer eine Rolle zu ihm zugewiesen haben. Nun ... Meine Frage ist: Wie erlaube oder verbiete ich den Zugriff auf bestimmte Ansichten/Controller in meiner .NET MVC-Anwendung? Ich habe auf dieser gestolpert:

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

Das Autorisieren Eigenschaft scheint die spezifischen Controller/Aktionen auf bestimmte Rollen zu beschränken ... Aber was ist, wenn ich die Benutzerrollen aus der Tabelle Userroles wie in meinem Fall lesen ?? Wie wird meine Anwendung wissen, welche Rolle der Benutzer auf dem System hat?

Kann mir jemand dabei helfen?

+0

Haben Sie [ASP.NET-Identität] (https://www.asp.net/identity) ausgecheckt? – SeM

+0

Sie müssen Ansprüche mit Ihren Rollen in Ihrer 'Login()' Methode hinzufügen. – SeM

+0

Das oben genannte ist bereits in dem in MVC5 integrierten Identitätsframework implementiert. Sie müssen sich keine Gedanken darüber machen, diese Tabellen selbst zu erstellen, ändern Sie einfach die Standardverbindungszeichenfolge und zeigen Sie sie auf einen Server. – uk2k05

Antwort

7

Lässt vortäuschen Sie Ihren Benutzernamen und Rollen gespeichert haben Sitzung:

+0

Ausgezeichnetes Beispiel, vielen Dank !! :) – User987

+0

Gern geschehen :) – SeM

+0

Ich habe diese Methode jetzt versucht, aber es sagt, dass die AuthenticationManager-Klasse SignIn-Methode aus irgendeinem Grund nicht enthält:/ – User987

1

Wenn Sie eine Rolle für den Zugriff auf einen Controller (auf Klassenebene) oder eine Aktion (Funktionsebene) autorisieren, haben diese Rollen Zugriff. Andernfalls wird der Zugriff verweigert.

Wenn Sie nur das Autorize-Schlüsselwort verwenden, ohne die Rollen oder Benutzer anzugeben, haben alle authentifizierten Benutzer Zugriff.

hoffentlich voll mache ich es klar?

Ansprüche zu verwenden, basierte Identität beziehen sich auf die folgenden

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

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

dies auf Core ist

What is the claims in ASP .NET Identity

+0

Ja, ich verstehe dich. Das Problem hier ist, wie ich die Rollen aus meiner DB hinzufügen, so dass die Anwendung weiß, welche Rolle der Benutzer aus der DB hat. @SeM sagte, ich könnte es mit etwas namens "Claims" tun ... Ist das der richtige Weg? – User987

+0

ja Ansprüche basiert ist ein Weg zu gehen, habe ich meine Ruhe mit einigen Links, die Ihnen helfen können – Emil

0

Hier sind einige Codeabschnitte, wie Sie das mit Azure Active Directory erreichen können. Konfigurieren der Anwendung in 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(); 
} 

Und hier ist die Nutzung:

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

und:

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

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

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

Hier ist mein Blog-Post auf, dass: http://www.eidias.com/blog/2016/1/16/using-azure-active-directory-application-roles. Dort finden Sie Informationen zur Konfiguration der oben genannten Rollen in AAD.