8
votes

Comment mettre en œuvre des contrôles d'autorisation dans ASP.NET MVC en fonction des données de session?

Ce sera ma première application ASP.NET MVC avec authentification des formulaires, donc j'essaie de vous assurer de ne rien manquer. Le scénario est ceci: zones publiques / sécurisées.

Dans la zone privée, il est encore plus limité à des zones / utilisateurs spécifiques. Ces "zones" sont définies par les personnalisations à la zone de base personnalisée par groupe d'utilisateurs.

Ainsi, par exemple, un utilisateur pourrait accéder à URL / zone / contrôleur / action . Ils devraient avoir la permission à la zone sécurisée ou être redirigé vers la vue de la connexion.

J'ai lu sur le Autorizeattribute mais je ne sais pas comment / où je devrais faire ces chèques de base. Mon Hunch initial serait de stocker un objet utilisateur dans la session après une connexion réussie avec la propriété intellectuelle et des détails de l'utilisateur sur ce qu'ils ont accès à etc.

La vérification de l'autorisation de chaque appel de contrôleur sécurisé vérifierait qu'un objet utilisateur valide existe dans la session, les IPS correspondent toujours et l'utilisateur a accès à la zone spécifique. Y a-t-il des trous évidents à cette configuration?

edit: où / comment puis-je implémenter ces chèques de sorte que lorsqu'un contrôleur est étiqueté avec [Autoriser], il effectuera ces contrôles d'objet de session?

Tous les pointeurs ou suggestions seraient très appréciés. Merci.


0 commentaires

4 Réponses :


2
votes

2 commentaires

J'essaie de rester à l'écart de la solution cuite au four si possible. Je ne sais pas à quel point il est personnalisable.


Nope .. Le rôle proviseur est la classe de base que vous devriez / pourrait mettre en œuvre votre propre personnalisation. Pour commencer avec une autorisation de rôle personnalisée, vous allez simplement étendre la classe ProPavider et modifier le fichier web.config pour en informer.



1
votes

Dans mon application précédente, j'ai utilisé un simple httpmodule simple pour augmenter l'utilisateur authentifié avec des rôles supplémentaires, etc. (je l'ai fait parce que mes exigences étaient très contraintes).

public class AuthorisationModule : IHttpModule
{
    public void Init( HttpApplication context )
    {
        context.AuthorizeRequest += AuthorizeRequest;
    }

    private void AuthorizeRequest(object sender, EventArgs e)
    {
        var currentUser = HttpContext.Current.User;
        if( !currentUser.IsAuthenticated() )
        {
            return;
        }

        var roles = new List<string>();
        // Add roles here using whatever logic is required

        var principal = new GenericPrincipal( currentUser.Identity, roles.ToArray() );
        HttpContext.Current.User = principal;
    }

    public void Dispose()
    {
        if(HttpContext.Current == null )
        {
            return;
        }

        if(HttpContext.Current.ApplicationInstance == null)
        {
            return;
        }

        HttpContext.Current.ApplicationInstance.AuthorizeRequest -= AuthorizeRequest;
    }
}


0 commentaires

11
votes

Eh bien, on dirait que je suis allé avec un autoraeattribute personnalisé. C'était en fait très simple. Voici le code: xxx

puis sur mes contrôleurs, je dois juste mettre un attribut [Secure] [CODE> et utilise ma fonction ci-dessus à tout moment que le contrôleur est accessible. Assez simple. J'ai également fait un attribut [SecorbyRole] , qui fait également toutes les mêmes choses, mais vérifie également mes informations de rôle personnalisées. Pas besoin de pour tous ceux qui construites dans Voodoo à partir de la composition en conserve :)


0 commentaires

1
votes
[Authorize]
public class BaseController : Controller
{
    protected override void OnAuthorization(AuthorizationContext authContext)
    {
        if
            (
            !User.Identity.IsAuthenticated &&
            Request.LogonUserIdentity != null &&
            Request.LogonUserIdentity.IsAuthenticated
            )
        {
            var logonUserIdentity = Request.LogonUserIdentity.Name;
            if (!string.IsNullOrEmpty(logonUserIdentity))
            {
                if (logonUserIdentity.Contains("\\"))
                    logonUserIdentity = logonUserIdentity.Substring(logonUserIdentity.IndexOf("\\") + 1);

                var db = new UsersContext();
                var loginUser =
                    db.UserProfiles.FirstOrDefault(x => x.UserName == logonUserIdentity);

                //Auto-Login Windows Identity
                if (loginUser == null)
                    loginUser = CreateUser(db, logonUserIdentity);

                if (loginUser != null)
                {
                    FormsAuthentication.SetAuthCookie(loginUser.UserName, true);

                    string returnUrl = Request.RawUrl;
                    if (!string.IsNullOrEmpty(returnUrl))
                        Response.Redirect(returnUrl);
                    Response.Redirect("~/");

                }
            }
        }
    }

    private static UserProfile CreateUser(UsersContext db, string logonUserIdentity)
    {
        var user = new UserProfile {UserName = logonUserIdentity};
        db.UserProfiles.Add(user);
        db.SaveChanges();
        return user;
    }
}

0 commentaires