自定义 UserManager 始终返回 null

2023-12-12

我正在尝试创建自己的UserManager从原始版本延伸,当我通过电子邮件进行搜索时,找不到该用户。但是如果我从上下文中进行搜索,如果我找到用户(请参阅Get方法)。为了验证它是否确实得到了很好的实现,我覆盖了FindByEmailAsync方法并且它确实被调用,但我不知道为什么用户找不到它。一些帮助?谢谢你!

public void ConfigureServices(IServiceCollection servicesCollection)
{
    servicesCollection.AddDbContext<MyIndentityContext>(currentOptions =>
        currentOptions.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    servicesCollection.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddEntityFrameworkStores<MyIndentityContext>()
        .AddRoleStore<ApplicationRoleStore>()
        .AddUserStore<ApplicationUserStore>()
        .AddUserManager<ApplicationUserManager>()
        .AddRoleManager<ApplicationRoleManager>()
        .AddSignInManager<ApplicationSignInManager>()
        .AddDefaultTokenProviders();

        ...

        ...

        ...
}

public class MyIndentityContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    private readonly IConfiguration _configuration;

    private readonly IHttpContextAccessor _httpContextAccessor;

    public MyIndentityContext(DbContextOptions dbContextOptions, IHttpContextAccessor httpContextAccessor,
        IConfiguration configuration)
        : base(dbContextOptions)
    {
        _configuration = configuration;
        _httpContextAccessor = httpContextAccessor;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema("Sample.API");
    }

}

public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
    public ApplicationRoleManager(IRoleStore<ApplicationRole> roleStore,
        IEnumerable<IRoleValidator<ApplicationRole>> roleValidators, ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors, ILogger<ApplicationRoleManager> logger) : base(roleStore,
        roleValidators,
        keyNormalizer, errors, logger)
    {
    }
}

public class ApplicationSignInManager : SignInManager<ApplicationUser>
{
    public ApplicationSignInManager(UserManager<ApplicationUser> userManager, IHttpContextAccessor contextAccessor,
        IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor,
        ILogger<ApplicationSignInManager> logger, IAuthenticationSchemeProvider schemes) : base(userManager,
        contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
    {
    }
}

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> userStore, IOptions<IdentityOptions> optionsAccessor,
        IPasswordHasher<ApplicationUser> passwordHasher,
        IEnumerable<IUserValidator<ApplicationUser>> userValidators,
        IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors, IServiceProvider services, ILogger<ApplicationUserManager> logger) :
        base(userStore, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
            services, logger)
    { }

    // Custom implementation to check if you are really calling the method
    public override Task<ApplicationUser> FindByEmailAsync(string email)
    {
        return Task.Run(() => new ApplicationUser
        {
            UserName = "A_NAME"
        });
    }
}

public class ApplicationRoleStore : RoleStore<ApplicationRole, MyIndentityContext>
{
    public ApplicationRoleStore(MyIndentityContext dbContext, IdentityErrorDescriber identityErrorDescriber)
        : base(dbContext, identityErrorDescriber)
    {}
}

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, MyIndentityContext, string>
{
    public ApplicationUserStore(MyIndentityContext dbContext, IdentityErrorDescriber identityErrorDescriber)
        : base(dbContext, identityErrorDescriber)
    {}

}

public class ApplicationUser : IdentityUser {}

public class ApplicationRole : IdentityRole
{
    public ApplicationRole() { }

    public ApplicationRole(string roleName) : base(roleName) { }

    public ApplicationRole(string roleName, string roleDescription) : base(roleName)
    {
        Description = roleDescription;
    }

}

[Authorize]
[ApiController]
[Route("api/[controller]")]
[EnableCors(CORS.AllowSpecificOrigins)]

public class UserController : BaseController
{
    private readonly ApplicationUserManager _applicationUserManager;

    public UserController(ApplicationUserManager applicationUserManager)
    {
        _applicationUserManager = applicationUserManager;
    }

     // GET: api/User/5
    [HttpGet("{id}")]
    public async Task<UserDTO> Get(int id)
    {

            var currentUser = await _applicationUserManager.FindByEmailAsync("[email protected]"); ==> RETURN NULL!

            var otherUser = _indentityContext.Users.Where(x => x.Email == "[email protected]"); ==> RETURN CORRECT USER!

            return currentUser;

    }

}

注意:此答案引用了 Github 重现中显示的代码和值。

你打电话时UserManager.FindByEmailAsync,传递给该方法的值会被标准化 - 默认情况下,此标准化会将值转换为大写。然后使用该标准化值来搜索NormalizedEmail栏目中的AspNetUsers table.

在你的里面MyIndentityContext.OnModelCreating方法,您有以下代码:

modelBuilder.Entity<ApplicationUser>().HasData(
    new ApplicationUser
    {
        Email = "[email protected]"
    });

当您控制此处的数据并仅进行设置时Email, the NormalizedEmail数据库中的值未设置(它是null)。这意味着当您使用UserManager.FindByEmailAsync并正在寻找[email protected] in the NormalizedEmail列,没有匹配项。但是,当您使用DbSet直接看Email专栏,你can查找匹配的记录[email protected].

为了解决这个问题,我建议不要使用HasData要为您的用户播种,您可以使用UserManager.CreateAsync应用程序中种子方法内的方法。这将确保在记录保存在数据库之前正常化和其他相关处理发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 UserManager 始终返回 null 的相关文章

随机推荐

  • Cython - 动态 2D C++ 数组的 Memoryview

    目标 使用 Cython 从 2D C 字符数组获取 Memoryview 一点背景 我有一个本机 C 库 它生成一些数据并通过char 到 Cython 世界 数组在库中的初始化和操作大约是这样的 struct Result buffer
  • 从字符串列表创建 numpy 结构化数组

    我正在开发一个 python 实用程序来从第谷 2 星目录中获取数据 我正在开发的功能之一是查询目录并返回给定明星 ID 或一组明星 ID 的所有信息 我目前正在通过循环遍历目录文件的行来执行此操作 然后尝试将行解析为 numpy 结构化数
  • jQuery 甚至没有被调用

    我不知道这里发生了什么 我正在尝试在我的菜单上添加一个滑动切换 看起来非常简单 我试图简化它以尝试找到问题 这意味着我已经采取了所有链接出来和额外的jquery 只有底部的例子 最后的段落 但我不知道错误是什么 除了它不做任何事情 包括 剧
  • ASP.Net MVC 框架和数据绑定

    我在理解 MVC 框架背后的一些概念时遇到了一些困难 我正在做一个非常简单的应用程序 对产品进行分类 创建屏幕将仅使用一个下拉列表 显示类别列表 产品名称并提交 在普通的 Net 应用程序中 我会在 Page Load 中对服务器下拉列表进
  • 如何从窗口获取像素数据\像素缓冲区并提取RGB?

    我正在窗口上绘制文本 textOut 和矩形 我想从中获取 RGB 缓冲区 我该怎么做 有 2 个选项 首先 您可以使用 GetPixel 我用过很多次 它工作正常 COLORREF GetPixel HDC hdc int nXPos i
  • 如何找到 appleid.apple.com/auth/revoke 端点所需的 client_id 和 client_secret 值?

    我想在我的项目中为通过 Apple REST API 登录的用户使用帐户删除功能 在我的 iOS 应用程序中 curl 请求中指定的 client id 和 client secret 值对应于什么值 curl v POST https a
  • jquery 验证插件 - 提交时不验证

    我有一个包含多个字段的表单 我想在键盘输入和提交时验证其中一些字段 我调用 jquery 1 9 1 然后调用插件 1 11 1 然后使用我的 js 调用外部文件 我通过 Firebug 看到它们都在加载 如果我使用下面的代码 它根本不会验
  • HTML 全屏布局,具有最小宽度、最大宽度

    我有一个项目 例如 一个 div 标签 它占据屏幕宽度的 1 3 最小宽度为 500px 最大宽度为 700px 在它旁边 还有另一个项目占据屏幕的其余部分 如果我只是指定 66 的宽度 只要其他项目的高度不采用最大值之一 它就可以正常工作
  • 阻止杰克逊将数字读取为字符串

    Jackson 将输入数字读取为字符串 作为下面的示例 Student 类将名称 4567 读取为字符串 例如 输入 name 4567 Java类 Class Student String name Jackson 正在解析 JSON 文
  • 使用 StickyGridHeaders

    粘性网格标题 但它没有按应有的方式工作 或者至少没有按我想要的方式工作 所以我得到了这个列表 里面有其他列表 然后我创建了一个标题列表 我使用原始列表 和一个完整的项目列表 所有子项目 然后像这样调用适配器 List
  • 为什么在创建 SqlClient 类型时会出现缺少方法异常运行时?

    我有以下代码 open FSharp Data
  • $_SERVER['REQUEST_URI'] 也带有 #hash 吗?

    如果我要求site page php hash the SERVER REQUEST URI 只是 page php 有没有办法在 php 没有后来的 ajax 中知道用户请求的页面 hash Thanks 简短回答 不 哈希不会传递到服务
  • Grails 使用带有 3 个以上逻辑参数的动态查找器

    我成功地使用 Hibernate 的动态查找器在数据库中进行搜索 def temp User findByNameAndStreet name street 虽然 我需要这样的三重逻辑论证 def temp User findByNameA
  • 嵌入式 Flash MP3 播放器在某些文件上速度缓慢,在其他文件上正常

    我正在使用基于 Flash 的嵌入式 MP3 播放器 独立版本WordPress 音频播放器 准确的说 在客户端的网页上播放音频 鉴于基于 Flash 的播放器的性质 AFAIK 他们都使用 Flash 的音频 视频解码库 确切的播放器产品
  • 如何向 Console.ReadLine() 添加超时?

    我有一个控制台应用程序 我想在其中向用户提供x秒响应提示 如果在一段时间后没有输入 程序逻辑应该继续 我们假设超时意味着空响应 解决这个问题最直接的方法是什么 我惊讶地发现 5 年后 所有答案仍然存在以下一个或多个问题 使用了 ReadLi
  • 无法使用 Facebook API 获取位置和电子邮件

    在我的 Android 应用程序中 我开发了这段代码来使用我的帐户登录并获取用户属性 例如姓名 位置和电子邮件 问题是我可以获得姓名 但无法获得电子邮件和位置 当我尝试我的代码而不尝试捕获应用程序崩溃和我的日志点时getproperty e
  • @RequestMapping正则表达式

    我正在尝试为 spring RequestMapping 注释创建 value 属性来像这样映射 url educationDistrict 308 action resetAddressesForYear 1 and this educa
  • 使用读取繁重的 Slave 管理热备中 Postgres 复制的冲突和滞后

    要求 Avoid terminating connection due to conflict with recovery错误也可以接受replication lag Google Cloud PostgreSQL 9 6 复制已打开 使用
  • 如何在 Objective C 中创建单例类

    如何在 Objective C 中创建单例类 好吧 appDev 您可能会在网络上找到很多不同的技术来做到这一点 然而 对于iOS应用程序开发 我认为最方便的方法是执行以下操作 编写获取单例对象的方法 建议 使用dispatch once线
  • 自定义 UserManager 始终返回 null

    我正在尝试创建自己的UserManager从原始版本延伸 当我通过电子邮件进行搜索时 找不到该用户 但是如果我从上下文中进行搜索 如果我找到用户 请参阅Get方法 为了验证它是否确实得到了很好的实现 我覆盖了FindByEmailAsync