Конструктор SignInManager изменяется, если он не находится в веб-проекте ASP.NET Core

Описание

Я создал собственный SignInManager , чтобы переопределить метод SignOutAsync. Он отлично работает в веб-проекте ASP.NET Core.

Я изменяю архитектуру своего приложения, чтобы изолировать всю логику Identity Framework на уровне службы. Поэтому я хочу переместить свой CustomSignInManager из проекта ASP.NET Core в проект библиотеки классов службы. В проекте Service есть ссылки на пакеты Microsoft.AspNetCore.Authorization и Microsoft.AspNetCore.Identity.

Проблема

Когда я перемещаю CustomSignInManager из проекта ASP.NET Core в библиотеку классов, я получаю следующие две ошибки компилятора:

  1. Имя типа или пространства имен IUserConfirmation<> не найдено (вам не хватает директивы using или ссылки на сборку?) [Services]csharp(CS0246)
  2. SignInManager<> не содержит конструктора, принимающего 7 аргументов [Services]csharp(CS1729)

Как показано в исходном коде, конструктор SignInManager действительно принимает 7 аргументов, а IUserConfirmation — 7-й аргумент.

Код

Я создал репозиторий , чтобы воспроизвести эту ошибку. Оба проекта Web и Service имеют один и тот же класс CustomSignInManager. Но по неизвестным мне причинам проект ServiceCustomSignInManager имеет две упомянутые выше ошибки времени компиляции.

Персонализированный менеджер входа

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 аргументов?

Окружающая среда. Запустите пользователя с сервисной учетной записью. По умолчанию служба запускается как система, не имеющая среды.

jdweng 04.04.2023 16:16

Я в замешательстве. Запустить какого пользователя со служебной учетной записью? Как это помогает компилировать библиотеку классов?

zwoolli 04.04.2023 16:21

Среда содержит пути для размещения файлов. Ошибка указывает на то, что библиотеки не могут быть найдены. Вы можете открыть csproj с помощью блокнота и проверить, где находятся библиотеки в рабочем коде, а затем убедиться, что эти местоположения действительны в службе. В csproj есть ссылки на переменные среды.

jdweng 04.04.2023 16:26

Насколько я могу судить, файл csproj показывает, на какие пакеты ссылаются. Но у меня в сервисе нет переменных окружения csproj

zwoolli 05.04.2023 00:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш 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. Есть идеи?

zwoolli 05.04.2023 00:09

Похоже, мне нужно было включить ссылку на платформу Microsoft.AspNetCore.App. «Проекты, использующие Microsoft.NET.Sdk или Microsoft.NET.Sdk.Razor SDK, должны ссылаться на ASP.NET Core, чтобы использовать API-интерфейсы ASP.NET Core в общей платформе».

zwoolli 05.04.2023 00:33
Ответ принят как подходящий

Как указано в ответе 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>

Другие вопросы по теме