40 votes

Attribut d'autorisation personnalisé

Je suis en train de construire mon propre système d'adhésion et je ne veux rien avoir à faire avec le MME fournisseur d'appartenances. J'ai regardé autour de l'internet et ici sur StackOverflow mais tout ce que je pourrais trouver est l'adhésion des fournisseurs construit sur le haut de la MS du fournisseur d'appartenances.

De toute façon, j'ai presque tout accroché jusqu'à maintenant, mais je voudrais utiliser un custom Autoriser attribut qui a utilisé mon adhésion à l'infrastructure. J'ai vérifié ce fil de discussion ici sur le site et je suis en train de faire quelque chose de similaire, mais je ne suis pas sûr que c'est calme ce dont j'ai besoin. Jusqu'à présent ce sont les classes que j'ai obtenu:

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 suis pas vraiment sûr si c'est ce que je devrais être en train de faire)

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

Maintenant, voici ce dont j'ai besoin:

  1. Est mon SharweAuthorizeAttribute classe corriger en premier lieu?
  2. J'ai besoin d'être en mesure de rediriger les les utilisateurs non authentifiés à la connexion page
  3. J'ai besoin d'autoriser les utilisateurs sur la base leurs rôles (en utilisant mon propre rôle le fournisseur), donc je ferais quelque chose comme:

    [SharweAuthorize(Roles="MyRole")]
    

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

Mise à JOUR: Ok je viens de lire cette page et de trouver 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);
}

Permettez-moi de savoir si je l'ai eu droit s'il vous plaît...

21voto

Eduardo Molteni Points 23135

Oui, vous l'avez droit (de l'OMI, il est plus sûr et plus simple à mettre en œuvre un fournisseur d'appartenances personnalisé, mais c'est votre choix)

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

Edit: un peu plus sur les rôles chose

si vous avez

[SharweAuthorize(Roles="MyRole")]

ensuite, vous pouvez vérifier le rôle de la propriété dans le AuthorizeCore méthode

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X