Blazor: IServiceCollection не содержит определения для AddDefaultIdentity

следуя этому руководству, я столкнулся с проблемой в файле Startup.cs:

(нужно немного прокрутить вниз, извините)

проблема связана с идентификатором по умолчанию, возникает следующая ошибка:

«IServiceCollection не содержит определения для AddDefaultIdentity и нет доступного метода расширения AddDefaultIdentity, принимающего первый аргумент типа« IServiceCollection может быть найден (вам не хватает директивы using или ссылки на сборку?) »

Я просмотрел документация, но мне не хватает того, какую ошибку я делаю, я видел кучу случаев, похожих на мой, но их решение (в комплекте), похоже, не работает. Я могу нам помочь, заранее спасибо.

"мой" код - ЗДЕСЬ, если вы хотите взглянуть


person Francesco Iapicca    schedule 03.06.2019    source источник
comment
Какую версию ASP.NET Core вы используете? Впервые это было доступно в версии 2.1.   -  person Scott Hannen    schedule 03.06.2019
comment
Требуемый пакет - microsoft.aspnetcore.identity.ui.   -  person Henk Holterman    schedule 03.06.2019
comment
Эта ветка Blazor - в wasm (клиентский Blazor) запрос публикации HttpClient не сохраняет файл cookie в браузере # 9894 содержит подробную информацию о добавлении Identity в Blazor   -  person Dmitry Pavlov    schedule 03.06.2019
comment
Предварительная версия @ScottHannen .net core 3.0 в предварительной версии Visual Studio 2019 после этого docs.microsoft.com/en-us/aspnet/core/blazor/   -  person Francesco Iapicca    schedule 04.06.2019
comment
@DmitryPavlov Я не уверен, что это соответствует моему случаю, но это может быть полезно в будущем, в любом случае спасибо   -  person Francesco Iapicca    schedule 04.06.2019
comment
@Francesco Iapicca: это сработало безупречно. Да, для добавления пользовательского интерфейса по умолчанию требуется microsoft.aspnetcore.identity.ui, но эта система используется в Razor Pages и MVC, а не в Blazor, и особенно не с аутентификацией JWT. Хорошо, добавьте этот пакет, чтобы ошибки исчезли, что дальше?   -  person enet    schedule 04.06.2019


Ответы (1)


Вы не должны добавлять удостоверение, если используете Jwt autentication ... Примечание. Метод расширения AddDefaultIdentity используется для добавления службы пользовательского интерфейса по умолчанию для Razor Pages и MVC. И это также требует, чтобы вы добавили StaticFiles.

Обратите внимание на дополнительный код и его расположение в методе Configure.

Попробуйте это в своем классе запуска:

 public class Startup
{
    //add
    public IConfiguration Configuration { get; }
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }


    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddNewtonsoftJson();

        services.AddTransient<IJwtTokenService, JwtTokenService>();


        //Setting up Jwt Authentication
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Jwt:Issuer"],
                    ValidAudience = Configuration["Jwt:Audience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
                };
            });


        services.AddResponseCompression(opts =>
        {
            opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "application/octet-stream" });
        });
    }

 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBlazorDebugging();
            }

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(routes =>
     {
         routes.MapDefaultControllerRoute();
     });

    app.UseBlazor<Client.Startup>();
        }
    }

}

Надеюсь это поможет...

Обновление 1: * Обновите свой класс Startup с помощью приведенного выше кода * Добавьте аннотацию к контроллеру SampleDataController следующим образом:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 
[Route("api/[controller]")]
    public class SampleDataController : Controller
    {
    // ..
    }
  • Запустите приложение, а затем отправьте HTTP-запрос в Postman или Fiddler для URL-адреса:

api / SampleData / WeatherForecasts

Ответ должен содержать созданный JwtToken

Краткое описание процесса выполнения: отправка запроса на получение в ваш веб-API. Запрос к точке маршрута WeatherForecasts перенаправляется контроллеру токена, цель которого - создать токен Jwt и вернуть его вызывающей стороне. Обратите внимание, что этот контроллер не проверяет личность пользователя, от имени которого был отправлен этот запрос ...

TO DO:

  • Создайте службу для хранения токена Jwt: эта служба может использовать расширения Blazor для LocalStorage и SessionStorage для хранения и получения токенов Jwt. Эта служба может содержать такие методы, как IsAutenticated, GetToken и т. Д.

Примечание. Вы можете передать токен Jwt с сервера в Blazor с более подробной информацией о пользователе в виде файла cookie.

  • Создайте компонент входа в систему для входа пользователя, если он еще не вошел в систему и пытается получить доступ к защищенному ресурсу.

Примечание. Если пользователь уже аутентифицирован, он не перенаправляется на форму входа. Вместо этого мы отправляем HTTP-запрос на сервер, чтобы получить исходники, необходимые в Blazor, если это так.

Примечание: как мы узнаем, аутентифицирован ли наш пользователь? Мы запрашиваем наш метод IsAutenticated. Если пользователь аутентифицирован, если получить токен Jwt и добавить его в коллекцию заголовков, переданную с помощью нашего вызова HttpClient.

Еще не все...

Вы видите это ?

person enet    schedule 03.06.2019
comment
спасибо, что изучили это, я пытаюсь следить за вашим ответом (я сижу нормально, что у меня нет файла .Server .csproj?) - person Francesco Iapicca; 04.06.2019
comment
звучит хорошо, не так ли? WWW-Authenticate → Канал X-исходников, → =? UTF-8? B? QzpcVXNlcnNcaWFwaWNcRG9jdW1lbnRzXEdpdEh1YlxCbGF6b3JcQmxhem9yX0F1dGhfRGVtb18zXEJsYXpvcl9BdXRoX0RlbW9fMy5TZXJ2ZXJcYXBpXFNhbXBsZURhdGFcV2VhdGhlckZvcmVjYXN0cw ==? = БЛАГОДАРЯ MATE! - person Francesco Iapicca; 04.06.2019
comment
@Francesco Iapicca, я добавил больше информации к своему ответу, если вам интересно. Кроме того, вам следует обновить заголовок своего вопроса, чтобы отразить, о чем на самом деле этот вопрос: Использование аутентификации Jwt в Blazor ... - person enet; 05.06.2019