asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了.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的每个方法中插入断点,看看一切是如何组合在一起的.

大佬总结

以上是大佬教程为你收集整理的.net – 实现UserManager以使用自定义类和存储过程全部内容,希望文章能够帮你解决.net – 实现UserManager以使用自定义类和存储过程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。