with tutorial started route query net mvc maphttproute attribute asp asp.net-web-api asp.net-identity

tutorial - ¿Cómo personalizar la autenticación a mi propio conjunto de tablas en asp.net web api 2?



web api query string parameters (1)

En el AccountController predeterminado creado veo

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

En Startup.Auth.cs veo

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

Parece que la implementación de UserStore proviene de Microsoft.AspNet.Identity.EntityFramework .

Entonces, para personalizar la autenticación, tengo que implementar mi propia versión de UserStore como

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

y anula los métodos y luego haz esto en Startup.Auth.cs

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

Estoy buscando una forma correcta de personalizar la autenticación.


Suponiendo que su tabla se llame AppUser , convierta su propio objeto de dominio IUser(using Microsoft.AspNet.Identity) a IUser(using Microsoft.AspNet.Identity) como este

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

Implemente el objeto UserStore como este

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 tiene su propio hash de contraseña personalizado, también deberá implementar IPasswordHasher . A continuación se muestra un ejemplo donde no hay hash de la contraseña (¡Oh, no!)

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

En Startup.Auth.cs replace

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

con

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

En ApplicationOAuthProvider.cs , reemplace IdentityUser con AppUser

En AccountController.cs , reemplace IdentityUser con AppUser y elimine todos los métodos de autenticación externos como GetManageInfo y RegisterExternal etc.