2011-03-25 2 views
2

Nous avons une application MVC qui a une vue/un contrôleur d'authentification de formulaires personnalisés. Le contrôleur vérifie les éléments, puis effectue un appel FormsAuthentication.RedirectFromLoginPage. À ce stade de Global.asax, nous recevrons un appel Application_OnAuthenticateRequest d'où nous obtiendrons leurs informations Context.User et effectuerons un autre appel pour collecter des informations relatives à ce compte que nous stockons dans leur contexte. & System.Threading.Thread.CurrentPrincipal. Nous faisons aussi un peu de mise en cache de cette information puisque dans notre système de récupération de ce dont nous avons besoin est cher qui conduit à l'invalidation de cache & re-récupération de cette information.Authentification en deux étapes dans MVC?

Il semble un peu étrange à ce stade que nous avons ces séparés en appels distincts. Je me demande presque si le contrôleur de connexion ne devrait pas rassembler les détails dans le cadre de son contrôle d'authentification et de les stocker. Ensuite, la demande Application_OnAuthenticateRequest ne peut s'inquiéter que si le cache doit être invalidé et les détails des utilisateurs récupérés.

Ou peut-être qu'il existe une autre façon de gérer cela, je ne sais même pas ..?

+0

https://stackoverflow.com/questions/47368154/how-to-make-google-authentication-scan-qr-code/47368506#47368506 ici vous obtenez votre solution –

Répondre

2

Vous pouvez faire ce que vous voulez dans MVC en tirant parti de RedirectToRouteResult et d'une mise à jour de cache personnalisée ActionFilter. C'est ce qu'on appelle le modèle PRG (Post-Redirect-Get). Vous êtes déjà en train de le faire, mais cela devient un peu confus, parce que ce que vous faites est un mélange entre la façon classique de faire ASP.NET et la façon de faire de MVC. Il n'y a rien de mal à votre approche initiale (à condition qu'il fonctionne correctement), mais pour faire le même genre de chose et d'avoir plus de contrôle et de compréhension de la façon dont cela fonctionne dans le schéma des choses que vous pourriez faire quelque chose comme:

public class AuthenticationController :Controller 
{ 
    [HttpPost] 
    public RedirectToRouteResult Login(string username, string password) 
    { 
     //authenticate user 
     //store authentication info in TempData like 
     bool authenticated = true|false; // do your testing 
     if(authenticated) 
     { 
      TempData["MustUpdateCache"] = true | false; 
      return RedirectToAction("LoginSuccess", new{userId = membershipUser.UserId});     
     } 
     else 
     { 
      TempData["MustUpdateCache"] = true | false; 
      return RedirectToAction("Login"); 
     } 
    } 

    [HttpGet, UpdateCache] 
    public ActionResult LoginSuccess(Guid userId, string url) 
    { 
     HttpContext.User = LoadUser(userId); 
     return View(); 
    } 

    [HttpGet, UpdateCache] 
    public ViewResult Login() 
    { 
     return View(); 
    } 

} 
public class UpdateCacheAttribute:ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var tempData = filterContext.Controller.TempData; 
     if (tempData.ContainsKey("MustUpdateCache") && (bool)tempData["MustUpdateCache"]) 
     { 
      UpdateCache(filterContext); 
     } 
    } 

    void UpdateCache(ControllerContext controllerContext) 
    { 
     //update your cache here 
    } 
} 
Questions connexes