首页 > 解决方案 > 找不到类型或命名空间 SigninManager<> 身份 3.1.1 Mediatr 8.0.0

问题描述

我正在尝试使用 Mediatr 库和模式来实现身份...

我使用的代码在 dotnetcore 2.x 和 identity 2.2 中确实有效,但在 dotnetcore 3.x 和 identity 3.1.1 中被破坏了......

我的应用程序类库是 netstandard2.1 并具有以下依赖项集。

<PackageReference Include="FluentValidation.AspNetCore" Version="8.6.1" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.1" />

我有这样的请求处理程序;

public class Handler : IRequestHandler<Query, AppUser>
    {
            private readonly UserManager<AppUser> _userManager;
            private readonly SignInManager<AppUser> _signInManager;

            public Handler(UserManager<AppUser> userManager, SignInManager<AppUser> signInManager)
            {
                _userManager = userManager;
                _signInManager = signInManager;
            }

            public async Task<AppUser> Handle(Query request, CancellationToken cancellationToken)
            {
                var user = await _userManager.FindByEmailAsync(request.Email);

                if (user == null)
                {
                    throw new Exception("Unauthorized");
                }

                // var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, false);
                var result = await _userManager.CheckPasswordAsync(user, request.Password);

                if (result)
                {
                    return user;
                }

                throw new Exception("Unauthorized");
            }
    }

我在这里遇到的问题是我无法再解决 SignInManager 并且我不知道为什么。我也找不到关于身份版本之间的任何重大更改的太多信息。SignInManager 去哪儿了?我认为 UserManager 在同一个命名空间中,并且 UserManager 解决得很好。现在超级困惑,正如你所看到的,我正准备欺骗我的出路,但它并不适合我。

在我的 API 项目中使用相同的依赖项,我可以使用相同的命名空间引用 SignInManager,并且可以使用它直接在控制器中登录。我怎样才能将它解耦到 Mediatr 处理程序?

标签: asp.net-core.net-coreasp.net-identitymediatr

解决方案


从 3.0 版开始,ASP.NET Core 不再完全通过 NuGet 分发。相反,它作为 .NET Core 运行时的一部分作为共享框架提供。只有可选包,如Microsoft.AspNetCore.Identity.EntityFrameworkCore仍然通过 NuGet 分发。但是,这些包没有定义会自动工作的临时依赖项,因此您仍然需要正确引用此共享框架才能使用这些类型。

为此,您需要将项目切换到目标netcoreapp3.1,因为 ASP.NET Core 仅在 .NET Core 上运行,不能与 .NET Standard 一起使用。

完成此操作后,您可以使用框架引用来引用共享框架。所以你的项目文件应该是这样的:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="FluentValidation.AspNetCore" Version="8.6.1" />
    <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.1" />
  </ItemGroup>

</Project>

推荐阅读