2013-08-05 7 views
8

Ich weiß in MVC an der Spitze eines Controllers können Sie das [Authorize()] Attribut verwenden, um den Zugriff auf den gesamten Controller auf bestimmte authentifizierte Benutzer und/oder Rollen zu beschränken, aber nicht durch IP, aber dies muss auf einer pro Controller-Instanz erfolgen. Gibt es eine Möglichkeit, den Zugriff auf einen gesamten MVC-Bereich auf einen authentifizierten Benutzer/eine authentifizierte Rolle oder auf die Anfrage Source IP zu beschränken?Wie schützt man einen gesamten MVC-Bereich nach IP/Rolle/Benutzer?

+0

Suche nach ** Benutzerautorisierungsattribut ** – Dmitry

+0

Ich möchte meine eigenen Attribute nicht erstellen. Ich möchte nur die eingebauten Rollen/Benutzer Autorisierungskontrollen nehmen und sie auf einer Gebietsebene anwenden. Es wäre auch schön, wenn ich eine Code-Prüfung für IPs auf der Gebietsebene anwenden könnte, ich weiß, dass ich eine .cs-Datei machen und sie von jeder Controller-Aktion aufrufen könnte, aber das ist ein bisschen mühsam. –

+1

Welche "eingebauten Rollen/Benutzer Autorisierungskontrollen" haben Sie im Sinn? Ich kann mir nichts anderes vorstellen als das Attribut "[Autorisieren]". Sie könnten einen Basiscontroller für Ihren Bereich haben, alle Controller in diesem Bereich von diesem Basiscontroller ableiten und dieses benutzerdefinierte Autorisierungsattribut auf den Basiscontroller schlagen. Das würde sich um die gesamte Bereichsautorisierung kümmern und Sie könnten es anpassen, um durch IP – Dmitry

Antwort

15

Erstellen Sie eine Basisstation in Ihrer Nähe:

[AuthorizeArea(AllowIpAddresses = new [] {"1.1.1.1", "1.2.3.4"})] 
public class CustomAreaBaseController : Controller 
{ 
    public CustomAreaBaseController() 
    { 
     // possibly any other common code that you want to run for all controllers in this area 
    } 
} 

Haben alle Controller in Ihrer Umgebung von Basis-Controller ableiten:

public class HomeController : CustomAreaBaseController 
{ 
    // actions for this controller 
} 

benutzerdefinierte Attribut erstellen autorisieren:

public class AuthorizeArea : AuthorizeAttribute 
{ 
    public string[] AllowIpAddresses { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool isValid = false; 

     if (httpContext == null) 
            throw new ArgumentNullException("httpContext"); 

     // get current ip address 
     var ipAddress = httpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
     if (string.IsNullOrEmpty(ipAddress)) 
      ipAddress = httpContext.Request.ServerVariables["remote_host"]; 

     if (AllowIpAddresses.Contains(ipAddress)) isValid = true; 

     return base.AuthorizeCore(httpContext) && isValid; 
    } 
} 
+0

Ich mag diesen Ansatz. Abgesehen davon, was würden Sie tun, wenn die IP-Adressen in einer Datenbank gespeichert wären? – harriyott

+0

Sie müssten sie aus db innerhalb dieser Methode abrufen und wahrscheinlich zwischenspeichern. – Dmitry

Verwandte Themen