.net - Implementing UserManager to use a custom class and Stored Procedures -
all of authentication , authorization process of app done using stored procedures. i've written class of functionalities need, e.g. getusers
, login
, addrole
, addmember
, etc. admin page managing users , roles , permissions done using class.
i need add authentication
(i mean authorize
attribute), cookies login , logout , storing server-side data each login. think need implement identity
that?
in case, can please guide me implementation? seems basic thing need implement create
method passes instance of iuserstore
constructor. don't need have tables users or roles, how can implement method?
this current class, , please let me know if need see custom authentication class uses stored procedures.
public class appusermanager : usermanager<appuser> { public appusermanager(iuserstore<appuser> store) : base(store) { } public static appusermanager create(identityfactoryoptions<appusermanager> options, iowincontext context) { //appusermanager manager = new appusermanager(); //return manager; return null; } }
as alisabzevari suggested have implement iuserstore.
not depend on storage , table structure defined. can customize every single bit of storage layer.
i did experiments , tried implement own usermanager
, rolemanager
using different storage, such biggy:
a file-based document store .net.
you can find code here on github.
first thing implement usermanager
can configure requirements password validation:
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 passwords this.passwordvalidator = new passwordvalidator { requiredlength = 4, requirenonletterordigit = false, requiredigit = false, requirelowercase = false, requireuppercase = false, }; } }
and define iuserstore
implementation. main method must implement createasync
:
public system.threading.tasks.task createasync(user user) { // saves user in storage. return task.fromresult(user); }
it receive iuser
have persist in custom storage , return it.
if have @ code i've implemented can see i've used few interfaces iuserrolestore
, iuserpasswordstore
, iuserclaimstore
etc etc needed use roles , claims.
i've implemented own signinmanager
.
once you've defined implementation can bootstrap @ 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));
you can check accountcontroller try validate user:
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); }
once passwordsigninasync
called notice few of methods of usermanager
called. first 1 findbynameasync:
public system.threading.tasks.task<user> findbynameasync(string username) { //fetch user using username. return task.fromresult(user); }
you have implement stored procedure, guess, you'll fetch user db.
then method findbyidasync
called:
public system.threading.tasks.task<user> findbyidasync(int userid) { // fetch - again - user db id. return task.fromresult(user); }
again you'll have use stored procedure find user his/her id.
if download project github , play around you'll notice of methods called multiple times. don't scared. that's way is.
i suggest insert breakpoints in every single method of userstore , see how fits together.
Comments
Post a Comment