2016-11-18 3 views
10

IIS-Manager-Wie kann ich die URL-Autorisierung in MVC5 manuell überprüfen?

den Zugriff auf einen Web-App zu beschränken, ist ein Administrator in der Lage, die URL-Autorisierung von Benutzern und Gruppen über den IIS-Manager festgelegt:

IIS Autohrization Rules

Web .config

Der IIS-Manager speichert die Autorisierungsregeln in der web.config der App:

<security> 
    <authorization bypassLoginPages="true"> 
    <remove users="*" roles="" verbs="" /> 
    <add accessType="Allow" users="Testuser" /> 
    <add accessType="Deny" users="*" /> 
    </authorization> 
</security> 

Wenn bypassLoginPages auf true eingestellt ist, haben alle Benutzer Zugriff auf die Anmeldeseite.

<authentication mode="Forms"> 
    <forms [...] loginUrl="~/Auth/Login" [...] > 
    [...] 
    </forms> 
</authentication> 

MVC5 App:

Der Benutzer über eine benutzerdefinierte Login-Seite von seinem Windows-SamAccountName einzuloggen in hat und wenn ein Benutzer nicht angemeldet ist, wird er automatisch auf die Anmeldeseite umgeleitet werden Passwort. Die Anmeldeinformationen werden die Login Wirkung der AuthController gesendet werden:

[AllowAnonymous] 
public class AuthController : Controller 
{ 
    public ActionResult Login 
    { 
     // validation of SamAccountName and Password against Active Directory here. 

     [...] 

     // We want to check the authorization here. 

     // create authentication ticket 
     FormsAuthenticationTicket lFormsAuthenticationTicket = new FormsAuthenticationTicket(1, 
      SamAccountName, 
      DateTime.Now, 
      DateTime.Now.AddMinutes(AuthCookieTimeout), 
      RememberMe, 
      CustomData, 
      FormsAuthentication.FormsCookiePath); 

     // Encrypt the ticket. 
     string lEncryptedTicket = FormsAuthentication.Encrypt(lFormsAuthenticationTicket); 

     var lAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, lEncryptedTicket); 

     // Create the cookie. 
     Response.Cookies.Add(lAuthCookie); 

     [...] 

     return RedirectToAction("Index", "Main"); // redirect to the main controller 
    } 
} 

Alle eingeschränkt Controller machen die Berechtigungsprüfung über das [Authorize] Attribut automatisch:

[Authorize] 
public class MainController : Controller 
{ 
    [...] 
} 

Eine Dekoration wie [Authorize(Users="User1,User2")] ist keine Lösung, weil die Code ist nicht für Endbenutzer zugänglich, die die Möglichkeit haben sollten, den Zugriff auf die App zu konfigurieren.

Wenn ein Benutzer nicht autorisiert ist, wird er zur Anmeldeseite weitergeleitet. Das funktioniert gut. Aber ich muss die Berechtigungsprüfung in der Aktion Login vorher vornehmen. Also meine Frage:

Wie kann ich manuell in meinem AuthController validieren, wenn der angemeldete Benutzer autorisiert ist, auf die MainController umzuleiten?

Antwort

5

F: Wie kann ich manuell in meinem AuthController überprüfen, ob die angemeldeten Benutzer berechtigt ist, die MainController zu umleiten?

Da Sie das Attribut Authorize verwenden, müssen Sie die Berechtigung in der Aktion nicht manuell überprüfen. Dies sind einige Regeln:

  • Beschränken Sie den Zugriff auf authentifizierte Benutzer: [Authorize]
  • Beschränken Sie den Zugriff auf einige spezifische Benutzer: [Authorize(Users="User1,User2")]
  • Beschränken Sie den Zugriff auf einige spezifische Rollen: [Authorize(Roles="Administrators,PowerUsers")]

Da Sie die dekorierte MainController mit Authorize Attribut bedeutet dies, dass niemand auf seine Aktionen zugreifen kann, ohne sich einzuloggen. So in Logon Aktion müssen Sie nicht überprüfen, ob der Benutzer berechtigt ist, um zum Hauptcontroller umzuleiten. Es gibt hier keine Sicherheitslücke und Sie müssen sich keine Sorgen über die Autorisierung machen, wenn Sie RedirectToAction("Index", "Main") verwenden.

Q: Eine Definition in der das Autorisieren Attribut würde nicht lösen das Problem . Wie können Administratoren Benutzer und Gruppen einschränken, wenn sie die Software kaufen? Sie haben keinen Zugriff auf den Code.

Rollen werden für diese Anforderung erstellt. Sie sollten [Authorize(Roles="Role1")] über MainController verwenden und dann kann jeder Benutzer von Role1 auf die Aktionen des Hauptcontrollers zugreifen. Es kann einfach im Benutzer- und Rollenmanagement Ihrer Anwendung durchgeführt werden. Also:

  1. Zur Entwicklungszeit, dekorieren Controller und Aktionen mit statischen Rollen
  2. Zur Laufzeit können Sie Benutzerrolle mit Ihrer Anwendung verwalten.

Hinweis

In den meisten Anwendungen Rollen sind statisch und man kann sagen, welche Rolle den Zugriff auf die Wirkung haben kann. In solchen Fällen würde das aktuelle Attribut Authorize für die Autorisierung ausreichen. Fügen Sie den Rollen zur Laufzeit nur Benutzer hinzu. Identity Samples enthält die erforderlichen Modelle, Ansichten und Controller dazu.

In einem Fall, in dem Sie zur Laufzeit neue Rollen erstellen oder die Berechtigungen einer Rolle zur Laufzeit ändern möchten, müssen Sie ein neues Authorize Attribut erstellen, das die Rolle des Benutzers aus einer Konfigurationsdatei oder Datenbank liest Lesen Sie die Berechtigungen einer Rolle aus einer Konfigurationsdatei oder Datenbank und entscheiden Sie über die Autorisierung.

+0

"Da Sie den MainController mit dem Autorize-Attribut versehen haben, bedeutet dies, dass niemand auf seine Aktionen zugreifen kann, ohne sich einzuloggen." → Das ist falsch. Wenn ein Benutzer angemeldet ist (FormsAuthenticationTicket ist festgelegt) und nicht autorisiert ist (URL-Autorisierung von Benutzern und Gruppen über den IIS-Manager), dann wird im Debug-Modus der Haltepunkt in der ersten Zeile des von [Authorized] deklarierten Controllers nicht aktiviert gerührt sein. Wenn der Benutzer jedoch angemeldet und berechtigt ist, kann er auf den Controller zugreifen. – Simon

+0

Sie haben es nicht verstanden. ** 1) ** Wenn Sie '[Autorisieren] 'verwenden, kann niemand ohne Login darauf zugreifen. OK? → es bedeutet, dass jeder, der angemeldet ist, darauf zugreifen kann. ** 2) ** Wenn Sie '[Authorize (Users =" User1, User2 ")]] verwenden, bedeutet dies, dass zwischen den angemeldeten Benutzern nur Benutzer1 und Benutzer2 auf die Aktion zugreifen können. –

+0

Sie haben meinen Kommentar nicht verstanden. Sie sagten: "Wenn Sie [Autorisieren] verwenden, kann niemand ohne Login darauf zugreifen. OK? → Es bedeutet, dass jeder, der angemeldet ist, darauf zugreifen kann." Das ist falsch. Nicht jeder kann darauf zugreifen. Wenn ein Benutzer über eine Definition in der Datei web.config abgelehnt wird, kann er nicht darauf zugreifen. Das ist die aktuelle Tatsache. Eine Definition im Autorize-Attribut würde das Problem nicht lösen. Wie können Administratoren Benutzer und Gruppen beim Kauf der Software einschränken? Sie haben keinen Zugriff auf den Code. – Simon

3

Sie sollten nicht <authorization> Tag in ASP.Net MVC verwenden. Es ist für ASP.Net Web Form gemeint. Sie können mehr in SO lesen.

In ASP.Net MVC möchten Sie [Authorize] Attribut verwenden. Darüber hinaus wollen Sie OWIN Middle statt alten FormsAuthenticationTicket verwenden.

Es hat wenige Stücke, also habe ich ein Beispielprojekt in GitHub AspNetMvcActiveDirectoryOwin erstellt. Die ursprüngliche Quelle ist die Authentifizierung mit AD, aber Sie müssen nur die ActiveDirectoryService-Klasse optimieren.

die folgenden drei sind die wichtigsten Klassen -

  1. AccountController

  2. ActiveDirectoryService

  3. OwinAuthenticationService ersetzt FormsAuthentication.

+0

Ich möchte nicht tag ??? Ich denke du hast meine Frage nicht verstanden. – Simon

+0

Ich habe meine Frage aktualisiert. Die Verwendung von '' in ASP.Net MVC führt Sie zu großen Sicherheitslücken. – Win

+0

Die App verwendet bereits das Attribut [Autorisieren]. Bitte lies meine Frage. – Simon

3

Zwei Optionen,

Entweder verwenden Sie die „Rollen“ Option unter Authorize wie so:

[Authorize(Roles="TestUsers,Admins")] 

Und dann die Benutzer hinzufügen, die Zugriff auf diese Aktion zu diesen Rollen erlaubt werden sollte. Rollen werden als Teil der ClaimsPrincipal von ASP Identity zur Verfügung gestellt.

Oder stellen Sie alternativ Ihre eigene Implementierung des Authorize-Attributs bereit, das den derzeit angemeldeten Benutzer auf die Geschäftsregeln prüft, die Sie haben, und dann den Zugriff entweder zulassen oder nicht zulassen.

+1

Hat es etwas mehr als das, was ich in meiner Antwort gesagt habe? Wenn Sie denken, dass es die Lösung ist, müssen Sie Ihre eigene Antwort nicht posten, Sie können die vorhandene Antwort abstimmen! –

Verwandte Themen