Come alisabzevari suggerito è necessario implementare il IUserStore.
Non si dipende nemmeno dalla memoria e dalla struttura della tabella definita. È possibile personalizzare ogni singolo bit del livello di archiviazione.
ho fatto alcuni esperimenti e cercato di attuare il mio UserManager
e RoleManager
utilizzando un deposito diverso, come ad esempio Biggy: a base di File
Un Documento Store per .NET.
È possibile trovare il codice here su GitHub.
prima cosa da fare è quello di attuare il vostro UserManager
cui è possibile configurare i requisiti per la convalida della password:
public class AppUserManager : UserManager<AppUser, int>
{
public AppUserManager (IUserStore<AppUser, int> store): base(store)
{
this.UserLockoutEnabledByDefault = false;
// this.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(10);
// this.MaxFailedAccessAttemptsBeforeLockout = 10;
this.UserValidator = new UserValidator<User, int>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
// Configure validation logic for passwords
this.PasswordValidator = new PasswordValidator
{
RequiredLength = 4,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
}
}
e quindi definire il vostro IUserStore
implementation. Il metodo principale è necessario implementare è CreateAsync
:
public System.Threading.Tasks.Task CreateAsync(User user)
{
// Saves the user in your storage.
return Task.FromResult(user);
}
riceverà un IUser
che si deve persistere nel vostro storage personalizzato e restituirlo.
Se si dispone di uno sguardo al codice che ho implemented potete vedere ho usato un paio di interfacce IUserRoleStore
, IUserPasswordStore
, IUserClaimStore
ecc ecc come ho bisogno di utilizzare i ruoli e reclami.
Ho implementato anche il mio ownSignInManager
.
Dopo aver definito tutto l'implementazione è possibile il bootstrap tutto a startup:
app.CreatePerOwinContext<Custom.Identity.UserManager>(() => new Custom.Identity.UserManager(new Custom.Identity.UserStore(folderStorage)));
app.CreatePerOwinContext<Custom.Identity.RoleManager>(() => new Custom.Identity.RoleManager(new Custom.Identity.RoleStore(folderStorage)));
app.CreatePerOwinContext<Custom.Identity.SignInService>((options, context) => new Custom.Identity.SignInService(context.GetUserManager<Custom.Identity.UserManager>(), context.Authentication));
È possibile controllare il mio AccountController dove cerco di convalidare l'utente:
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
volta PasswordSignInAsync
si chiama noterai alcuni dei metodi del tuo UserManager
chiamati. Il primo sarà FindByNameAsync:
public System.Threading.Tasks.Task<User> FindByNameAsync(string userName)
{
//Fetch your user using the username.
return Task.FromResult(user);
}
Si dovrà implementare la stored procedure, immagino, dove potrete prendere il vostro utente dal DB.
Poi un altro metodo FindByIdAsync
sarà called:
public System.Threading.Tasks.Task<User> FindByIdAsync(int userId)
{
// Fetch - again - your user from the DB with the Id.
return Task.FromResult(user);
}
Anche in questo caso si dovrà utilizzare la stored procedure per trovare l'utente con la sua/il suo id.
Se si scarica il mio progetto da github e si gioca con esso, si noterà che molti di questi metodi verranno chiamati più volte. Non avere paura È così che va.
Vorrei suggerire di inserire punti di interruzione in ogni singolo metodo di UserStore e vedere come tutto si combina.
'L'input non è una stringa Base-64 valida poiché contiene un carattere non di base 64, più di due caratteri di riempimento o un carattere non valido tra i caratteri di riempimento. Per il login e in' UserManager.FindAsync' Ottengo l'errore sopra riportato. Qualche idea? Penso che sia relativo a 'GetPasswordHashAsync'. Cosa posso fare per quello? – Akbari
È difficile dirlo. Hai provato il mio progetto di esempio? FindAsync utilizza UserLoginInfo. Passa attraverso quella pipe se stai usando un provider esterno (google, facebook). Se non lo usi dovresti passare lì. Nel caso in cui si stia utilizzando un provider esterno è possibile implementare il gestore UserLoginInfo. È possibile controllare [implementazione] di Raven (https://github.com/ILMServices/RavenDB.AspNet.Identity/blob/master/RavenDB.AspNet.Identity/UserStore.cs#L134). – LeftyX
Grazie Lefty, ho controllato il tuo codice. Non sto usando provider esterni. E invece di usare Trova gestore utenti, ho usato la mia funzione personalizzata per risparmiare tempo! :) – Akbari