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. P>
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. P>
Ainsi, par exemple, un utilisateur pourrait accéder à URL J'ai lu sur le 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? P>
edit: strong> 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? P>
Tous les pointeurs ou suggestions seraient très appréciés. Merci. P> / zone / contrôleur / action code>. Ils devraient avoir la permission à la zone sécurisée ou être redirigé vers la vue de la connexion. P>
Autorizeattribute code> 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. P>
4 Réponses :
Essayez de regarder le Rolefrovider Classe a>. Il s'agit du cadre de base de la manière dont ASP.NET utilise l'autorisation des basses manages aux utilisateurs. Et je pense que vous devriez utiliser [Autoriser (Rôles = '...' ... ' )] attribut à utiliser cela. P>
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.
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; } }
Eh bien, on dirait que je suis allé avec un autoraeattribute personnalisé. C'était en fait très simple. Voici le code: 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] CODE>, 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 :) p> p>
[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; } }