Я создал собственный SignInManager , чтобы переопределить метод SignOutAsync. Он отлично работает в веб-проекте ASP.NET Core.
Я изменяю архитектуру своего приложения, чтобы изолировать всю логику Identity Framework на уровне службы. Поэтому я хочу переместить свой CustomSignInManager
из проекта ASP.NET Core в проект библиотеки классов службы. В проекте Service есть ссылки на пакеты Microsoft.AspNetCore.Authorization
и Microsoft.AspNetCore.Identity
.
Когда я перемещаю CustomSignInManager
из проекта ASP.NET Core в библиотеку классов, я получаю следующие две ошибки компилятора:
IUserConfirmation<>
не найдено (вам не хватает директивы using или ссылки на сборку?) [Services]csharp(CS0246)SignInManager<>
не содержит конструктора, принимающего 7 аргументов [Services]csharp(CS1729)Как показано в исходном коде, конструктор SignInManager действительно принимает 7 аргументов, а IUserConfirmation — 7-й аргумент.
Я создал репозиторий , чтобы воспроизвести эту ошибку. Оба проекта Web
и Service
имеют один и тот же класс CustomSignInManager. Но по неизвестным мне причинам проект Service
CustomSignInManager
имеет две упомянутые выше ошибки времени компиляции.
using Domain.Entities;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Http;
namespace Services.Identity;
public class CustomSignInManager : SignInManager<ApplicationUser>
{
public CustomSignInManager(UserManager<ApplicationUser> userManager,
IHttpContextAccessor contextAccessor,
IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,
IOptions<IdentityOptions> optionsAccessor,
ILogger<SignInManager<ApplicationUser>> logger,
IAuthenticationSchemeProvider schemes,
IUserConfirmation<ApplicationUser> confirmation) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation) {}
public override async Task SignOutAsync()
{
await Context.SignOutAsync(IdentityConstants.ApplicationScheme);
}
}
Что отсутствует в моей библиотеке классов Service
, например:
IUserConfirmation<>
?SignInManager
не принимает 7 аргументов?Я в замешательстве. Запустить какого пользователя со служебной учетной записью? Как это помогает компилировать библиотеку классов?
Среда содержит пути для размещения файлов. Ошибка указывает на то, что библиотеки не могут быть найдены. Вы можете открыть csproj с помощью блокнота и проверить, где находятся библиотеки в рабочем коде, а затем убедиться, что эти местоположения действительны в службе. В csproj есть ссылки на переменные среды.
Насколько я могу судить, файл csproj показывает, на какие пакеты ссылаются. Но у меня в сервисе нет переменных окружения csproj
Ваш services.csproj показывает, что вы используете устаревшую ссылку на пакет для Microsoft.AspNetCore.Identity.
<PackageReference Include = "Microsoft.AspNetCore.Identity" Version = "2.2.0" />
Смотрите уведомление на GitHub.
Этот проект GitHub был заархивирован. О текущей разработке этого проекта можно узнать на https://github.com/aspnet/AspNetCore.
Вы должны использовать Microsoft.Extensions.Identity.Core с версией, соответствующей вашей целевой платформе.
<PackageReference Include = "Microsoft.Extensions.Identity.Core" Version = "6.0.15" />
Спасибо! Ссылка на пакет Microsoft.Extensions.Identity.Core
помогла устранить первую ошибку времени компиляции относительно IUserConfirmation
. Однако вторая ошибка все еще существует. При просмотре метаданных для SignInManager
в проекте Web
кажется, что используется пакет Microsoft.AspNetCore.Identity
с версией = 7.0.0.0. Я не могу найти этот пакет на nuget. Есть идеи?
Похоже, мне нужно было включить ссылку на платформу Microsoft.AspNetCore.App. «Проекты, использующие Microsoft.NET.Sdk или Microsoft.NET.Sdk.Razor SDK, должны ссылаться на ASP.NET Core, чтобы использовать API-интерфейсы ASP.NET Core в общей платформе».
Как указано в ответе pfx , services.csproj использовал устаревшую ссылку на пакет для Microsoft.AspNetCore.Identity.
Чтобы исправить обе ошибки времени компиляции, я удалил старую ссылку на пакет идентификации,
<PackageReference Include = "Microsoft.AspNetCore.Identity" Version = "2.2.0" />
и добавил ссылку на платформу для ASP.NET Core.
<ItemGroup>
<FrameworkReference Include = "Microsoft.AspNetCore.App" />
</ItemGroup>
Окружающая среда. Запустите пользователя с сервисной учетной записью. По умолчанию служба запускается как система, не имеющая среды.