加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 实现UserManager以使用自定义类和存储过程

发布时间:2020-12-15 19:00:05 所属栏目:asp.Net 来源:网络整理
导读:我的应用程序的所有身份验证和授权过程都是使用存储过程完成的.我写了一个包含我需要的所有功能的课程,例如GetUsers,Login,AddRole,AddMember等 此外,管理用户和角色和权限的管理页面也是使用此类完成的. 我只需要添加身份验证(我的意思是授权属性),用于登录
我的应用程序的所有身份验证和授权过程都是使用存储过程完成的.我写了一个包含我需要的所有功能的课程,例如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.

你可以在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的每个方法中插入断点,看看一切是如何组合在一起的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读