2013-12-11 5 views
25

In der Default-Account habe ichWie Anpassung der Authentifizierung an meine eigene Reihe von Tabellen in ASP.net Web API 2?

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

In Startup.Auth.cs sehen Ich sehe

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

wie die Umsetzung von Users Scheint kommt von Microsoft.AspNet.Identity.EntityFramework .

So anpassen, um die Authentifizierung zu tun haben, ich

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

meine eigene Version von Users wie zu implementieren und die Methoden außer Kraft setzen und diese dann in Startup.Auth.cs tun

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

I Ich suche nach einer korrekten Möglichkeit, die Authentifizierung anzupassen.

Antwort

42

Angenommen, Ihre Tabelle AppUser genannt wird, wandeln Sie Ihre eigene AppUser Domain-Objekt zu IUser(using Microsoft.AspNet.Identity) wie diese

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; 
     } 
    } 
} 

Umsetzung des UserStore Objekt wie dieses

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(); 
    } 

} 

Wenn Sie Ihre eigenen benutzerdefinierten Kennwort-Hashing Sie muss auch implementieren IPasswordHasher. Im Folgenden ist ein Beispiel, wo es kein Hashing des Passworts ist (Oh nein!)

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; 
    } 
} 

In Startup.Auth.cs

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

mit

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

In ApplicationOAuthProvider.cs ersetzen IdentityUser

In AccountController.cs, ersetzen IdentityUser mit AppUser und löschen Sie alle externen Authentifizierungsmethoden wie GetManageInfo und RegisterExternal usw.

+0

Dank für die Antwort, aber wie kann ich 'AppUser' von einem anderen Controller für die aktuelle Anforderung bekommen? –

+0

'User.Identity.Name' gibt Ihnen den Benutzernamen in einer authentifizierten Anfrage. – sunil

+0

Toller Beitrag und Erklärung. Danke, Sunil. –