2013-09-03 11 views
27

Ich habe eine interne Webanwendung in ASP.NET 4 gebaut. Wir verwenden eine Authentifizierungs-API, die von einem anderen Team erstellt wurde. Wenn ein Benutzer der Site erfolgreich für die Site authentifiziert wird, möchte ich ihm Zugriff auf die gesamte Site gewähren.Benutzerdefinierte Authentifizierung und ASP.NET MVC

In ASP.NET WebForm Tage habe ich nur ein benutzerdefiniertes Benutzerobjekt in Sitzung beibehalten. Wenn dieses Objekt null war, wusste ich, dass der Benutzer nicht authentifiziert wurde. Gibt es dafür eine ähnliche, aber verbesserte Methode in MVC. Ich möchte meinen eigenen Anbieter des ASP.NET-Mitgliedschaftsmodells, wenn möglich, nicht erstellen. Was ist der einfachste Weg dies zu tun?

+1

Können Sie das Authentifizierungsticket nicht einfach manuell nach dem Aufruf Ihrer alten API festlegen? – TheKingDave

+1

Wenn das 'FormsAuthenticationTicket' gesetzt ist, können Sie' Request.IsAuthenticated' und 'User.Identity' verwenden, um festzustellen, ob der Benutzer angemeldet ist. Auch das' Authorize'-Attribut funktioniert. –

+3

FYI, die Authentifizierung in der Sitzung ist eine sehr schlechte Idee, es ist unsicher (Cookie ist nicht verschlüsselt und leicht zu stehlen), und anfällig für Fehler als Sitzung kann jederzeit recycelt werden. Verwenden Sie stattdessen FormsAuthentication –

Antwort

5

Sie möchten wahrscheinlich eine benutzerdefinierte authorization filter haben. Hier ist ein Beispiel: Custom filters in MVC. Sie können diesen Filter dann global beim Start der App anwenden (mit RegisterGlobalFilters).

public class LegacyAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
    if (HttpContext.Current.Session["User"] == null) 
     base.HandleUnauthorizedRequest(actionContext); 
    } 
} 

Dann in Ihrem global.asax Sie etwas davon haben würde:

GlobalFilters.Filters.Add(new LegacyAuthorize()); 
+0

Das Überschreiben des Autorize-Attributs kann gefährlich sein, insbesondere wenn nur die Sitzung validiert wird. Die Sitzungs-ID wird nicht erneut generiert, was zu einem Session-Hijack über XSS usw. führen kann. Http://blog.securitypages.com/2013/06/session-fixation-forms-authentication.html und https://support.microsoft. com/de-de/kb/899918 – PJH

1

Alles, was Sie in Formen tun könnten Sie in MVC tun kann, sondern nur die Session-Variable in der Steuerung meldet sich gesetzt.

Oder Sie können dies tun. Mit dem [autorisieren] Stichwort Im Login-Aktion hinzufügen formsauthentication.setauthcookie("username")

Danach jede Aktion wird in den aktuellen Benutzer erlauben

3

Sie können mit so etwas wie dies versuchen:

FormsAuthentication.SetAuthCookie(username, rememberMe); 

das Cookie für authentifizierte Benutzer setzen, dann benutzen Sie einfach das [Authorize] Attribut auf dem Controller oder die Aktion, die eine Authentifizierung benötigen.

Versuchen Sie googeln zu diesem Thema für weitere Informationen, Sie finden eine Menge Zeug auf Authentifizierung und Autorisierung in MVC.

42

Sie Forms Authentication in Verbindung mit Authorize attibute verwenden können, wie folgt,

Um den Zugriff auf eine Ansicht zu beschränken:

Fügen Sie das AuthorizeAttribute Attribut auf die Aktionsmethode Erklärung, wie unten gezeigt,

[Authorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

Konfigurieren der Formularauthentifizierung in web.config

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

Anmeldung Beitrag Aktion: Set Authentifizierungscookie, wenn der Benutzer gültig ist

[HttpPost] 
public ActionResult Login(User model, string returnUrl) 
{ 
     //Validation code 

     if (userValid) 
     { 
      FormsAuthentication.SetAuthCookie(username, false); 
     } 
} 

Abmelden Aktion:

public ActionResult LogOff() 
{ 
    FormsAuthentication.SignOut(); 
    return RedirectToAction("Index", "Home"); 
} 
+0

Muss ich [Authorize] auf jede Controller-Methode in meiner gesamten App setzen? Ich möchte nur zwei Controller-Methoden für anonyme Benutzer öffnen (~/Account/Login GET und POST). Es scheint, als sollte es einen besseren Weg geben. Benötigt dies einen Filter? benutzerdefiniertes Attribut? Danke für Ihre Hilfe. +1 – BuddyJoe

+3

In diesem Fall schauen Sie hier http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx –

+0

Warum kann Ist die neue ASP-Identität so einfach wie 'FormsAuthentication'? https://www.asp.net/identity –

-2

Sie können indem man einfach einen Session-Variable Wert die Session-Authentifizierung tun, wenn die Login ist erfolgreich.

zB
public ActionResult Index(Models.Login login) 
    { 
     if (ModelState.IsValid) 
     { 
      Dal.Login dLogin = new Dal.Login(); 
      string result = dLogin.LoginUser(login); 
      if (result == "Success") 
       Session["AuthState"] = "Authenticated"; 
     } 
     return View(); 
    } 

Nun der Trick ist, dass man eine gemeinsame Layoutseite von allen Ansichten für die Authentifizierung zu denen müssen Sie überprüfen sollte. Und in dieser Layout-Seite tun, nur einen Rasierer Check so -

<body> 
    @if (Session["AuthState"] != "Authenticated") 
    { 
     Response.Redirect("~/login"); 
    } 
    // other html 
</body> 

Ich habe in meiner Anwendung Admin-Panel Mit dieser Methode wurde verwendet.

+0

Nur ein Kopf, dass diese Methode gefährlich ist und zu einer Sitzung Fixierung oder Session Hijack Attacke führen kann. Die Sitzungs-ID wird nie aktualisiert. In diesem Artikel finden Sie eine kurze Erklärung der Nachteile. tl; dr; Sie benötigen ein Authentifizierungscookie, das für eine angemeldete Sitzung eindeutig ist und idealerweise mit der Sitzung verknüpft ist. http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html – PJH

Verwandte Themen