2013-09-03 9 views
27

J'ai une application Web interne en cours de construction en ASP.NET 4. Nous sommes coincés avec l'utilisation d'une API d'authentification construite par une autre équipe. Si un utilisateur du site est authentifié avec succès pour le site, je voudrais lui donner accès à l'ensemble du site.Authentification personnalisée et ASP.NET MVC

In ASP.NET Jours WebForm J'ai simplement utilisé un objet Utilisateur personnalisé en session. Si cet objet était nul, je savais que l'utilisateur n'était pas authentifié. Existe-t-il une méthode similaire mais améliorée pour cela dans MVC. Je ne veux pas avoir à créer mon propre fournisseur du modèle d'adhésion ASP.NET si possible. Quelle est la manière la plus simple de le faire?

+1

Ne pouvez-vous pas définir manuellement le ticket d'authentification après votre appel à votre API héritée? – TheKingDave

+1

Si 'FormsAuthenticationTicket' est défini, vous pouvez utiliser' Request.IsAuthenticated' et 'User.Identity' pour déterminer si l'utilisateur est connecté. L'attribut' Authorize' fonctionnera également. –

+3

FYI, la gestion de l'authentification en session est une très mauvaise idée, elle n'est pas sûre (cookie n'est pas crypté et facilement volé), et sujette à l'échec car la session peut être recyclée à tout moment. Utilisez FormsAuthentication à la place –

Répondre

5

Vous voulez probablement avoir un authorization filter personnalisé. Voici un exemple: Custom filters in MVC. Vous pouvez ensuite appliquer ce filtre globalement au démarrage de l'application (en utilisant RegisterGlobalFilters).

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

Ensuite, dans votre global.asax vous auriez quelque chose comme ceci:

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

Le remplacement de l'attribut Authorize peut être dangereux, en particulier si vous ne validez qu'une session. Id de session n'est pas re-généré, ce qui peut conduire à un détournement de session via XSS, etc. http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html et https://support.microsoft. com/fr-fr/kb/899918 – PJH

1

Tout ce que vous pourriez faire dans les formes que vous pouvez faire dans MVC, juste la variable de session dans l'action de connexion du contrôleur.

Ou vous pouvez le faire. Dans l'action de connexion ajouter formsauthentication.setauthcookie("username")

Après cette toute action avec le mot-clé [Authorize] permettra à l'utilisateur actuel

3

Vous pouvez essayer quelque chose comme ceci:

FormsAuthentication.SetAuthCookie(username, rememberMe); 

pour définir le cookie pour l'utilisateur authentifié, puis il suffit d'utiliser l'attribut [Authorize] sur le contrôleur ou d'action qui ont besoin d'authentification. Essayez googling sur le sujet pour plus d'informations, vous trouverez beaucoup de choses sur l'authentification et l'autorisation dans MVC.

42

Vous pouvez utiliser Forms Authentication conjointement avec Authorize attibute comme suit,

Pour restreindre l'accès à une vue:

Ajoutez l'attribut AuthorizeAttribute à la déclaration de la méthode d'action, comme indiqué ci-dessous,

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

Configuration de l'authentification par formulaires dans web.config

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

Connexion Poster Action: Set cookie d'authentification si l'utilisateur est valide

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

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

Déconnexion Action:

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

Dois-je mettre [Authorize] sur chaque méthode de contrôleur dans mon application entière? Je veux seulement ouvrir deux méthodes de contrôleur aux utilisateurs anonymes (~/Account/Login GET et POST). On dirait qu'il devrait y avoir un meilleur moyen. Est-ce que cela nécessite un filtre? attribut personnalisé? Merci de votre aide. +1 – BuddyJoe

+3

Dans ce cas, regardez ici http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx –

+0

Pourquoi 't la nouvelle identité ASP est-elle aussi simple que' FormsAuthentication'? https://www.asp.net/identity –

-2

Vous pouvez faire l'authentification de session en mettant simplement une valeur variable de session lorsque la connexion est réussi.Par exemple,

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(); 
    } 

Maintenant, le truc est que vous devriez avoir une page de présentation commune de toutes les vues auxquelles vous devez vérifier pour l'authentification. Et dans cette page de mise en page il suffit de faire une vérification de rasoir comme celui-ci -

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

J'utilise cette méthode dans mon panneau d'administration de l'application.

+0

Juste un avertissement que cette méthode est dangereuse et peut entraîner une fixation de session ou une attaque de détournement de session. L'identifiant de session n'est jamais mis à jour. Voir cet article pour une explication rapide des inconvénients. tl; dr; vous avez besoin d'un cookie d'authentification unique à une session connectée et idéalement lié à la session. http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html – PJH

Questions connexes