2009-09-10 5 views
6

J'ai construit un système de connexion personnalisé pour mon application web asp.net mvc 1.0 car je stocke de grandes quantités de données utilisateur pour chaque utilisateur (j'ai décidé de ne pas essayer d'ajouter des tables personnalisées pour les fenêtres authentification en raison de cela). Le système de connexion utilise essentiellement SQL Server (2005 ou 2008) et ma propre base de données et structure de table qui est assez standard. Une table d'utilisateurs avec un identifiant unique, un nom d'utilisateur et un mot de passe haché qui est lié à mes autres tables de données liées à l'utilisateur.Authentification Windows avec ASP.NET MVC

Ma question est, comment puis-je lier mon système pour utiliser les connexions d'authentification Windows. Je voudrais permettre à l'administrateur pour un utilisateur (tel que défini dans mon système) sélectionner une connexion d'authentification Windows et peut-être ajouter une valeur à quelque chose dans ma table personnalisée que je peux utiliser pour les authentifier?

La question est probablement mal formulée et j'ai peut-être mal compris comment fonctionne l'authentification Windows, mais je voudrais offrir l'option dans mon application web.

+0

Je ne connais pas la réponse exacte mais: Je pense que pour travailler avec Windows auth, vous devez configurer le répertoire actif et avoir un utilisateur pour chaque personne sur votre réseau. Ensuite, je pense que vous avez besoin d'emprunter l'identité de l'utilisateur asp.net en utilisant le web.config et vous devriez être bon à faire. – rball

Répondre

8

Si vous utilisez Windows Auth activé sur votre site, vous devriez être en mesure d'utiliser User.Identity.Name pour obtenir leur NT/Active Directory nom d'utilisateur de l'utilisateur actuellement connecté et faites correspondre cela à une colonne de la table des utilisateurs.

+0

Donc en utilisant dans mon actionfilter HttpContext.Current.User.Identity.Name je peux accéder à mon nom d'utilisateur (MACHINE \ PHIL) et le IsAuthenticated est défini. Donc tout ce que je dois faire est d'ajouter une autre colonne à ma table d'utilisateur pour associer mon nom d'utilisateur à un User.IDentity.Name et vérifier qu'ils sont authentifiés? – Phil

+1

Si User.Identity.Name renvoie une valeur, ils sont authentifiés. Et plus encore, ils ne devraient pas être en mesure d'accéder à la page, sauf s'ils sont authentifiés (IIS va les forcer à authenitcate avant de rendre la page). – Scrappydog

1

Si je comprends bien votre question, vous souhaitez ajouter d'autres données liées à un nom d'utilisateur Windows authentifié?

Si oui, vous devrez stocker le nom d'utilisateur et cette information personnalisée dans une nouvelle table. Les données d'authentification Windows existent dans Active Directory. Vous pouvez donc consulter la liste des utilisateurs. Vous n'obtiendrez aucune information personnalisée ajoutée automatiquement à AD lorsque Windows authentifie l'utilisateur. Si vous voulez des informations personnalisées, vous devrez ajouter une recherche personnalisée dans AD ou simplement rechercher vos données personnalisées dans votre base de données en fonction de l'endroit où vous décidez de stocker les informations.

À peu près tout ce que vous obtenez avec l'authentification Windows est le nom d'utilisateur de l'utilisateur et la possibilité de vérifier les rôles (groupes AD) associés à cet utilisateur. Tout ce qui va au-delà de cela, vous devrez le coder manuellement.

J'ai récemment demandé l'implémentation de la personnalisation au-delà de la sécurité intégrée dans MVC et j'ai trouvé une solution par moi-même. Peut-être il y a quelques petits morceaux qui pourraient vous aider à répondre à votre question:

How to implement authorization checks in ASP.NET MVC based on Session data?

+0

Commentaire utile, de belles lectures de fond et d'autres idées. – Phil

8

Voilà comment nous l'avons fait pour une forme hybride/windows application d'authentification: -

public class MyBaseController 
{ 
    protected override void OnAuthorization(AuthorizationContext authContext) 
    { 
    if 
    (
     !User.Identity.IsAuthenticated && 
     Request.LogonUserIdentity != null && 
     Request.LogonUserIdentity.IsAuthenticated 
    ) 
    { 
     String logonUserIdentity = Request.LogonUserIdentity.Name; 
     if (!String.IsNullOrEmpty(logonUserIdentity)) 
     { 
     User loginUser = 
      Context.Users.FirstOrDefault(
      x => x.UserIdentity == logonUserIdentity); 
     if (loginUser != null) 
      FormsAuthentication.SetAuthCookie(
      loginUser.LoginName,createPersistentCookie); 
    } 
    } 

Il y a une encapsulation que j'ai pris pour des raisons de compacité.

+0

Merci pour l'extrait de code utile! :) – Phil

+0

Iain, cela vous dérangerait de poster plus de code?Je suis intéressé par encapsuler correctement cette fonctionnalité et comment vous avez configuré IIS (j'utilise IIS 7 moi-même). Merci. – wgpubs