web-dev-qa-db-fra.com

MembershipProvider personnalisé dans .NET 4.0

Il y a quelques fils ici à ce sujet, mais la plupart d'entre eux sont obsolètes et les liens de référence qu'ils contiennent sont encore plus obsolètes.

J'ai obtenu ce site Web dont j'ai besoin pour me connecter à un serveur SQL externe (mssql) avec sa propre structure de table, en utilisant la structure de fournisseur d'appartenance asp.net par défaut n'est pas une option. La disposition du tableau est vraiment simple et l'utilisable ressemble à ceci (il s'appelle les individus)

Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)

La fonctionnalité requise est simplement de connecter quelqu'un, le reste n'est pas nécessaire :)

J'ai suivi quelques guides mais la plupart d'entre eux sont obsolètes et très complexes. Malheureusement, les exemples msdn suivent ce modèle et la documentation n'est pas très bonne.

Donc, si quelqu'un a des ressources montrant comment, ou est prêt à publier des exemples de codes ou similaires ici, je l'apprécierais.

Merci!

40
Eric Herlitz

C'est vraiment très simple:

  1. Créez un nouveau fichier de classe (si vous n'utilisez pas un système multicouche, dans le dossier Modèles de votre projet) appelons MyMembershipProvider.cs

  2. Héritez cette classe de System.Web.Security.MembershipProvider

  3. créer automatiquement les méthodes nécessaires (point + espace dans la classe hérite)

Terminé!

Toutes les méthodes auront l'exception NotImplementedException, tout ce que vous devez faire est de modifier chacune et de mettre votre propre code. Par exemple, je définis le GetUser comme indiqué ci-dessous:

public override MembershipUser GetUser(string username, bool userIsOnline)
{
    return db.GetUser(username);
}

dbest mon référentiel de base de données que j'ai ajouté à la classe en tant que

MyServicesRepository db = new MyServicesRepository();

vous y trouverez la méthode GetUser comme:

public MembershipUser GetUser(string username)
{
    OS_Users user = this.FindUserByUsername(username);

    if (user == null)
        return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: "",
            providerUserKey: null,
            email: "",
            passwordQuestion: "",
            comment: "",
            isApproved: false,
            isLockedOut: true,
            creationDate: DateTime.UtcNow,
            lastLoginDate: DateTime.UtcNow,
            lastActivityDate: DateTime.UtcNow,
            lastPasswordChangedDate: DateTime.UtcNow,
            lastLockoutDate: DateTime.UtcNow);

    return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: user.username,
            providerUserKey: null,
            email: user.email,
            passwordQuestion: "",
            comment: "ANYTHING you would like to pass",
            isApproved: true,
            isLockedOut: user.lockout,
            creationDate: user.create_date,
            lastLoginDate: user.lastLoginDate,
            lastActivityDate: user.lastActivityDate,
            lastPasswordChangedDate: user.lastPasswordChangedDate,
            lastLockoutDate: user.lastLockoutDate);
}

Faites cela pour toutes les méthodes que vous utilisez (déboguez le projet et voyez celles dont vous avez besoin) - je n'en utilise que certaines, pas toutes car je ne me soucie pas vraiment des méthodes comme ChangePasswordQuestionAndAnswer, DeleteUser , etc

assurez-vous simplement que dans votre web.config vous ajoutez la nouvelle adhésion en tant que:

<membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>

Vous avez un joli tutoriel vidéo de Chris Pels (daté de 2007 mais toujours valide) et un code pour cela également, bien que le tutoriel vidéo soit en VB, mais laissez-vous comprendre les étapes ...

http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

J'ai non seulement créé mon propre fournisseur d'adhésion, mais j'ai également créé mon fournisseur de rôles , comme vous pouvez le voir ci-dessus, est aussi simple que le MemberShip et laissez-vous, dans votre application, utiliser des choses comme:

[Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
{

}

et

@if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
{
    <div>You're an ADMIN, Congrats!</div>
}

Qu'est-ce qui crée automatiquement les méthodes nécessaires (point + espace dans la classe héritée)

Vous pouvez soit cliquer avec le bouton droit, soit placer le curseur sur le nom et appuyer sur Control + . puis space.

62
balexandre

Il y a quelques fils ici à ce sujet, mais la plupart d'entre eux sont obsolètes et les liens de référence qu'ils contiennent sont encore plus obsolètes.

Depuis l'introduction d'ASP.NET dans Framework 1.0, le modèle Page.User/CurrentSession.User/IPrincipal/IIdentity est inchangé. Dans Framework 2.0, le fournisseur d'adhésion a été ajouté. Ces références "périmées" restent des indications valables. MSDN

0
Cos Callis