.net – 实现UserManager以使用自定义类和存储过程
|
我的应用程序的所有身份验证和授权过程都是使用存储过程完成的.我写了一个包含我需要的所有功能的课程,例如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:
你可以在GitHub上找到代码here. 首先要做的是实现您的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. 一旦定义了所有实现,就可以在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)); 您可以查看我尝试验证用户的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);
}
我猜你必须实现你的存储过程,你将从数据库中获取用户. 然后另一个方法FindByIdAsync将是called: public System.Threading.Tasks.Task<User> FindByIdAsync(int userId)
{
// Fetch - again - your user from the DB with the Id.
return Task.FromResult(user);
}
您必须再次使用存储过程通过他/她的ID查找您的用户. 如果你从github下载我的项目并玩它,你会发现大多数这些方法将被多次调用.不要害怕.它就是这样儿的. 我建议你在UserStore的每个方法中插入断点,看看一切是如何组合在一起的. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 我可以在MasterPage中使用UpdatePanel来包装嵌套
- asp.net-mvc-3 – 如何根据当前页面和/或主页在Orchard CMS
- asp.net-mvc-3 – AutoMapper线程问题(缺少类型映射配置或不
- asp.net-mvc – Sammy.js和Knockout.js =模板没有模板?
- 使用asp.net连接到mySQL数据库
- asp.net – 为什么默认情况下GET请求返回JSON不允许?
- asp.net-mvc – 编辑多个子记录的ASP.NET MVC示例
- asp.net-mvc – 无法加载文件或程序集”或其依赖项之一.该进
- asp.net – 如何检查IIS是否在32位或64位模式
- asp.net-mvc – 为什么被赋予NoValidate属性?
- asp.net – 如何在VB.NET中JSON编码数组?
- asp.net-mvc-3 – ViewBag/ViewData生命周期
- asp.net-mvc – 如何在Razor View中格式化lambda
- asp.net – 使用OLEDB读取CSV文件,即使连接字符串
- asp.net-mvc – 为什么应该使用HTTP POST或DELET
- asp.net – Orchard – 从主题布局中获取内容的标
- asp.net – 如何获得Google Prettify更像Visual
- asp.net – 从请求中获取所有发布数据
- asp.net-mvc-3 – 在Application_Start中访问nin
- asp.net-mvc – MVC5:@ Html.TextBoxFor(或Edit
