web-dev-qa-db-fra.com

Comment créer un attribut personnalisé qui redirigera vers Login s'il renvoie faux, similaire à l'attribut Authorize - ASP.NET MVC

J'ai essayé de googler quelques choses sur les attributs personnalisés, mais je ne sais toujours pas comment s'y prendre ...

Je stocke quelques détails importants de l'utilisateur dans les cookies de session (ex UserID) une fois que l'utilisateur est connecté .. et tout ce que je veux faire est de créer un attribut où si le

if (Session["UserID"] == null)

puis il redirigera vers la connexion comme le fait l'attribut [Autoriser]. De cette façon, je peux appliquer cet attribut au niveau du contrôleur partout.

Dois-je remplacer l'attribut Autoriser? Créer un nouveau? Comment puis-je le rediriger pour me connecter également?

J'utilise également ASP.NET MVC 4

Merci pour toute aide

12
user1189352

Vous pouvez créer un AuthorizeAttribute personnalisé et remplacer AuthorizeCore() et HandleUnauthorizedRequest() selon vos besoins. Ajoutez votre propre logique qui fera la vérification et redirigera si nécessaire.

Je montre juste un exemple simple en utilisant le ActionFilterAttribute de MVC (qui n'est pas le meilleur endroit pour faire l'authentification/l'autorisation)

public class VerifyUserAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var user = filterContext.HttpContext.Session["UserID"];
        if (user == null)
            filterContext.Result = new RedirectResult(string.Format("/User/Login?targetUrl={0}",filterContext.HttpContext.Request.Url.AbsolutePath));
    }
}

N'oubliez pas de régler le Session["UserID"] variable dans votre /User/Login méthode d'action après validation de l'utilisateur.

21
Arghya C

Vous pouvez créer votre propre version de l'attribut Authorize en implémentant l'interface IAuthorizationFilter . Voici un exemple:

class MyCustomFilter : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Session["UserID"] == null)
        {
            filterContext.Result = new RedirectResult("/");
        }
    }
}

et un exemple d'utilisation:

[MyCustomFilter]
public ActionResult About()
{
    ViewBag.Message = "Your application description page.";

    return View();
}
9
Nasreddine