web-dev-qa-db-fra.com

Attribut d'autorisation personnalisé

Je crée mon propre système d'adhésion et je ne veux rien avoir à faire avec le fournisseur d'adhésion MS. J'ai regardé sur Internet et ici sur StackOverflow mais tout ce que j'ai pu trouver était des fournisseurs d'adhésion construits au-dessus du fournisseur d'adhésion MS.

Quoi qu'il en soit, j'ai presque tout connecté maintenant, mais j'aimerais utiliser un attribut Authorize personnalisé qui utilise mon infrastructure d'adhésion. J'ai vérifié ce fil ici sur le site et j'essaie de faire quelque chose de similaire, mais je ne suis pas sûr que ce soit calme ce dont j'ai besoin. Jusqu'à présent, ce sont les classes que j'ai:

SessionManager:

public static class SessionManager : ISessionManager
{
    public static void RegisterSession(string key, object obj)
    {
        System.Web.HttpContext.Current.Session[key] = obj;
    }

    public static void FreeSession(string key)
    {
        System.Web.HttpContext.Current.Session[key] = null;
    }


    public static bool CheckSession(string key)
    {
        if (System.Web.HttpContext.Current.Session[key] != null)
            return true;
        else
            return false;
    }


    public static object ReturnSessionObject(string key)
    {
        if (CheckSession(key))
            return System.Web.HttpContext.Current.Session[key];
        else
            return null;
    }
}

SharweAuthorizeAttribute: ( je ne sais pas vraiment si c'est vraiment ce que je devrais faire)

public class SharweAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true)
            return true;
        else 
            return false;
    }
}

Voici maintenant ce dont j'ai besoin:

  1. Ma classe SharweAuthorizeAttribute est-elle correcte en premier lieu?
  2. Je dois pouvoir rediriger les utilisateurs non authentifiés vers la page de connexion
  3. Je dois autoriser les utilisateurs en fonction de leurs rôles (en utilisant mon propre fournisseur de rôles), donc je ferais quelque chose comme:

    [SharweAuthorize(Roles="MyRole")]
    

C'est tout, je suppose ... Toutes les suggestions sont les bienvenues :)

MISE À JOUR: Ok Je viens de relire cette page et j'ai trouvé la solution à la question numéro deux:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (SessionManager.CheckSession(SessionKeys.User) == false)
    {
        filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary 
                        {
                            { "action", "ActionName" },
                            { "controller", "ControllerName" }
                        });
    }
    else
        base.HandleUnauthorizedRequest(filterContext);
}

Faites-moi savoir si je l'ai bien fait s'il vous plaît ...

40
Kassem

Oui, vous avez bien compris (IMO, il est plus sûr et plus simple d'implémenter un fournisseur d'adhésion personnalisé, mais c'est votre choix)

  1. Oui c'est correct
  2. Vous le faites correctement
  3. Vous héritez de la propriété roles de la classe de base AuthorizeAttribute et vous vérifiez dans votre implémentation si l'utilisateur est dans le rôle.

Edit: un peu plus sur la chose des rôles

si tu as

[SharweAuthorize(Roles="MyRole")]

vous pouvez ensuite vérifier la propriété Roles dans la méthode AuthorizeCore

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if (SessionManager.CheckSession(SessionKeys.User) == true) {
        if (SessionManager.CheckUserIsInRole( Roles )) // where Roles == "MyRole"
           return true;
    }
    return false;
}
21
Eduardo Molteni