我的应用程序的所有身份验证和授权过程都是使用存储过程完成的.我写了一个包含我需要的所有功能的课程,例如GetUsers,Login,AddRole,AddMember等
此外,管理用户和角色和权限的管理页面也是使用此类完成的.
此外,管理用户和角色和权限的管理页面也是使用此类完成的.
我只需要添加身份验证(我的意思是授权属性),用于登录和注销的cookie以及为每个登录存储一些服务器端数据.我想我需要为此实现身份?
在这种情况下,你能指导我实施吗?您需要做的最基本的事情是实现一个将IUserStore实例传递给构造函数的create方法.但我不需要为用户或角色提供任何表,我该如何实现此方法?
这是当前的类,如果您需要查看使用存储过程的自定义身份验证类,请告诉我.
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; } }
解决方法
正如
alisabzevari建议您必须实施
IUserStore.
您甚至不依赖于定义的存储和表结构.
您可以自定义存储层的每个位.
您甚至不依赖于定义的存储和表结构.
您可以自定义存储层的每个位.
我做了一些实验并尝试使用不同的存储实现我自己的UserManager和RoleManager,例如Biggy:
A File-based Document Store for .NET.
首先要做的是实现您的UserManager,您可以在其中配置密码验证的要求:
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,}; } }
然后定义您的IUserStore implementation.您必须实现的主要方法是CreateAsync:
public System.Threading.Tasks.Task CreateAsync(User user) { // Saves the user in your storage. return Task.FromResult(user); }
它将收到一个IUser,您必须在自定义存储中保留并返回它.
如果您查看我implemented的代码,您可以看到我使用了一些接口IUserRoleStore,IUserPasswordStore,IUserClaimStore等,因为我需要使用角色和声明.
我还实现了我的own SignInManager.
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));
您可以查看我尝试验证用户的AccountController:
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); }
调用PasswordSignInAsync后,您会注意到将调用UserManager的一些方法.第一个是FindByNameAsync:
public System.Threading.Tasks.Task<User> FindByNameAsync(string userName) { //Fetch your user using the username. return Task.FromResult(user); }
public System.Threading.Tasks.Task<User> FindByIdAsync(int userId) { // Fetch - again - your user from the DB with the Id. return Task.FromResult(user); }
您必须再次使用存储过程通过他/她的ID查找您的用户.