wake-up-neo.com

Rollenbasierte Autorisierung mit .NET MVC 5 implementieren

Ich möchte eine rollenbasierte Autorisierung in meiner von mir erstellten Webanwendung implementieren. Ich stellte mir vor, dass ich dazu 3 Tabellen in meiner Datenbank erstellen würde:

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

Danach wird jedem Benutzer eine Rolle zugewiesen. Nun ... Meine Frage lautet: Wie erlaube oder verbiete ich den Zugriff auf bestimmte Ansichten/Controller in meiner .NET-MVC-Anwendung? Ich bin darauf gestoßen:

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

Die Authorize-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 lese? Woher weiß meine Anwendung, welche Rolle der Benutzer auf dem System hat?

Kann mir jemand dabei helfen?

7
User987

Angenommen, Sie haben Ihren Benutzernamen und Ihre Rollen in der Sitzung gespeichert

[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);

    . . . .
}
7
SeM

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

wenn Sie nur das Schlüsselwort Authorize verwenden, ohne die Rollen oder Benutzer anzugeben, haben alle authentifizierten Benutzer Zugriff.

hoffe voll ich mache es klar? 

um die anspruchsbasierte identität zu verwenden, beziehen sie sich auf folgendes 

https://msdn.Microsoft.com/de-de/library/ee517291.aspx

https://msdn.Microsoft.com/de-de/library/ff359101.aspx

das ist im Kern 

Wie lauten die Ansprüche in ASP .NET Identity

1
Emil

Im Folgenden finden Sie einige Codeabschnitte, wie Sie dies mithilfe von Azure Active Directory erreichen können. Anwendung in Startup.cs konfigurieren:

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 Verwendung:

[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 dazu: http://www.eidias.com/blog/2016/1/16/ using-Azure-active-directory-application-roles . Dort finden Sie, wie Sie die obigen Rollen in AAD konfigurieren.

0
Dawid Rutkowski