Blazor: IServiceCollection не содержит определения для AddDefaultIdentity - PullRequest
1 голос
/ 03 июня 2019

после этого учебник Я обнаружил проблему в файле Startup.cs:

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

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

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

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

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

1 Ответ

1 голос
/ 03 июня 2019

Вы не должны добавлять идентификационные данные, если используете аутентификацию Jwt ... Примечание. Метод расширения 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: * Обновите ваш класс запуска с помощью кода выше * Аннотируйте свой контроллер SampleDataController следующим образом:

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

апи / SampleData / WeatherForecasts

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

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

TO DO:

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

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

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

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

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

Еще не все ...

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

...