web-dev-qa-db-fra.com

Comment personnaliser l'authentification à mon propre ensemble de tables dans l'api web asp.net 2?

Dans le AccountController par défaut créé, je vois

    public AccountController()
        : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
    {
    }

Dans Startup.Auth.cs je vois

    UserManagerFactory = () => 
                new UserManager<IdentityUser>(new UserStore<IdentityUser>());   

On dirait que l'implémentation de serStore vient de Microsoft.AspNet.Identity.EntityFramework.

Donc, pour personnaliser l'authentification, dois-je implémenter ma propre version de UserStore comme

 class MYSTUFFUserStore<IdentityUser> : UserStore<IdentityUser>
 {
 } 

et remplacer les méthodes, puis faites-le dans Startup.Auth.cs

UserManagerFactory = () => 
               new UserManager<IdentityUser>(new MYSTUFFUserStore<IdentityUser>());   

Je cherche un moyen correct de personnaliser l'authentification.

26
sunil

En supposant que votre table s'appelle AppUser, convertissez votre propre objet de domaine AppUser en IUser(using Microsoft.AspNet.Identity) comme ceci

using Microsoft.AspNet.Identity;
public class AppUser : IUser
{
    //Existing database fields
    public long AppUserId { get; set; }
    public string AppUserName { get; set; }
    public string AppPassword { get; set; }

    public AppUser()
    {
        this.Id = Guid.NewGuid().ToString();  
    }

    [Ignore]
    public virtual string Id { get; set; }         
    [Ignore]
    public string UserName
    {
        get
        {
            return AppUserName;
        }
        set
        {
            AppUserName = value;
        }
    }
}

Implémentez l'objet UserStore comme ceci

using Microsoft.AspNet.Identity;
public class UserStoreService 
         : IUserStore<AppUser>, IUserPasswordStore<AppUser>
{
    CompanyDbContext context = new CompanyDbContext();

    public Task CreateAsync(AppUser user)
    {            
        throw new NotImplementedException();
    }

    public Task DeleteAsync(AppUser user)
    {
        throw new NotImplementedException();
    }

    public Task<AppUser> FindByIdAsync(string userId)
    {
        throw new NotImplementedException();
    }

    public Task<AppUser> FindByNameAsync(string userName)
    {
        Task<AppUser> task = context.AppUsers.Where(
                              apu => apu.AppUserName == userName)
                              .FirstOrDefaultAsync();

        return task;
    }

    public Task UpdateAsync(AppUser user)
    {
        throw new NotImplementedException();
    }

    public void Dispose()
    {
        context.Dispose();
    }

    public Task<string> GetPasswordHashAsync(AppUser user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        return Task.FromResult(user.AppPassword);
    }

    public Task<bool> HasPasswordAsync(AppUser user)
    {
        return Task.FromResult(user.AppPassword != null);
    }

    public Task SetPasswordHashAsync(AppUser user, string passwordHash)
    {
        throw new NotImplementedException();
    }

}

Si vous avez votre propre hachage de mot de passe personnalisé, vous devrez également implémenter IPasswordHasher. Voici un exemple où il n'y a pas de hachage du mot de passe (Oh non!)

using Microsoft.AspNet.Identity;
public class MyPasswordHasher : IPasswordHasher
{
    public string HashPassword(string password)
    {
        return password;
    }

    public PasswordVerificationResult VerifyHashedPassword
                  (string hashedPassword, string providedPassword)
    {
        if (hashedPassword == HashPassword(providedPassword))
            return PasswordVerificationResult.Success;
        else
            return PasswordVerificationResult.Failed;
    }
}

Dans Startup.Auth.cs remplacer

UserManagerFactory = () => 
     new UserManager<IdentityUser>(new UserStore<IdentityUser>());

avec

    UserManagerFactory = () => 
     new UserManager<AppUser>(new UserStoreService()) { PasswordHasher = new MyPasswordHasher() };

Dans ApplicationOAuthProvider.cs, remplacez IdentityUser par AppUser

Dans AccountController.cs, remplacez IdentityUser par AppUser et supprimez toutes les méthodes d'authentification externes comme GetManageInfo et RegisterExternal etc.

44
sunil