Настройка и использование Dotnet Core Web API в Angular 7 - PullRequest
0 голосов
/ 16 декабря 2018

Я создал web-интерфейс ядра dotnet, который хочу использовать в своем приложении angular 7.Я столкнулся с несколькими проблемами:

  1. Я настроил свое промежуточное ПО на использование аутентификации Jwt (см. Частичный код ниже);однако я получал код состояния 404, когда ожидал 401. Когда неавторизованный пользователь пытался получить доступ к авторизованному ресурсу, он перенаправлялся на страницу входа, которая не существовала.Я наткнулся на пост, описывающий, как переопределить applicationcookie, чтобы вернуть 401 вместо 404. Это частично решает мою проблему.
  2. При вызове API я получаю 401, но мне нужно добавить параметр cookie взаголовок запроса.
  3. В моем приложении Angular я могу получить токен.Однако любой запрос к маршруту авторизации в API возвращает 404, поскольку в заголовке отсутствует параметр cookie.Я попытался добавить готовку в заголовок, но получаю сообщение об ошибке "http.js: 1436 Отказался установить небезопасный заголовок" cookie ".

Jwt configuration

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddJwtBearer(options =>
   {
    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
  {
    ...
  };
});

вместо переопределения 404 на 401.

// Configure the Application Cookie
services.ConfigureApplicationCookie(options => {
    // Override the default events
    options.Events = new CookieAuthenticationEvents
    {
        OnRedirectToAccessDenied = ReplaceRedirectorWithStatusCode(HttpStatusCode.Forbidden),
        OnRedirectToLogin = ReplaceRedirectorWithStatusCode(HttpStatusCode.Unauthorized)
    };

    // Configure our application cookie
    options.Cookie.Name = ".applicationname";
    options.Cookie.HttpOnly = true; // This must be true to prevent XSS
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.None; // Should ideally be "Always"

    options.SlidingExpiration = true;
});

частичный код для углового перехватчика - На основании нескольких комментариев я удалил cookieи оставил «withcredential»: «true» или «включенный». Это не имело никакого значения. Я жестко закодировал значения заголовка на данный момент.

 intercept(request : HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>>{
    const headers = new HttpHeaders({
        'cookie':'ASPNET_COOKIE=CfDJ8K9C4yVY5HtDnXVGM_H-y2wweqlBcYiVLelvIMw2xntKY9j_AMP1GvLahXrR4fSNhbS3AysDXYVgFCrT_-LOyHT0iofBVwdllx3UHpXvbhXrCwSofHk5CwJn3Ae5dPI9gzx-BQSxIuwTQy-SF6LcYp9ctShzvQ5D6Qxty6OHuV5yGW8ShqQ05yV0qMdxivI87j6hv2eTdTW5oAqgYEN7LRUUA9MYz7Rq8i-XSB1KirtLC0v1i5NirYdENY2XNSpRF50A5lTu2m7M1CGe8TPU1mF2RW_rV7lOHAk-HYRCl80k8vYG8SVBYMrrK3soGApWcaDteZfJtN_K_g-xhZ2etT-js0ie0nCB_OWENrBilDpl8-0AcvjqvXG5E4AFXLh47XhAbRjkIOZECZn2WU_BT6TnvCkzUevgFZDMVVx6XmqUWzYb9WESlAoWfX4RYWnaDucba_FJDlMoi3YlXEaJgDnIB1-xYSKuuGScvAt7o49595pWLyFH4Yw7qgyOeLB5YpnookVPIEmyxj3-VXe5DU7mbW1GPFZMlcFXGU9P8RwkY0LO1OJiZP0wFh4NAQ_WSockhB8t_q0vM5jOBxcLNGTricbAZcEyYTwFa-XAKNgHXqu4q7LUCID02jZpNYbdj204CIV0I1H_kUN-e2AciA8QHFCx-gpq_6Tl-1t_vOaHW1sFfxHP2fvqu3r5hlVK2Q',
        'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3VzZXJkYXRhIjoidXNlcnR3b0Bkc3NpbmMuY29tIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIjoidXNlcnR3b0Bkc3NpbmMuY29tIiwiZXhwIjoxNTQ0OTE0MDQxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjIwMDEvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDoyMDAxLyJ9.WJhyQHGxjUykg5GXrcnm2vdadxmRF83iBwwRheddu8w',
        'Content-Type': 'application/json',
        'withCredentials' :'true'
      });
    console.log('modifying headers');
     const cloneRequest = request.clone({headers});
     return next.handle(cloneRequest)

CORS enable

  services.AddCors(options =>
            {
            options.AddPolicy("AllowSpecificOrigin",
                builder => builder
                .WithOrigins("http://localhost:4200")
                .AllowAnyHeader() // version important for cors.
                .AllowAnyMethod() //very import in order for cors to work
                    //.WithExposedHeaders("")
                    );
            });

Я надеюсь, что кто-то укажет другую конфигурацию для API или способ установки cookie в угловом формате.

Обновлено

Я смог сузить проблему до фрагмента кода ниже. Когда я закомментирую их, я получаю 401, когда я пытался получить доступ к неавторизованному ресурсу.

    services.AddIdentity<IdentityUser, IdentityRole<string>>(options =>
    {
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequiredLength = 4;
        options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.Password.RequireUppercase = false;
        options.Password.RequiredUniqueChars = 1;

        options.User.RequireUniqueEmail = false;
        options.Lockout.AllowedForNewUsers = true;
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);

    }).AddEntityFrameworkStores<ClientPanelDbContext>()
    .AddDefaultTokenProviders();

1 Ответ

0 голосов
/ 16 декабря 2018

Это была моя ошибка, и я наконец понял это после большого разочарования.API работал нормально, и я смог получить токен и получить доступ к защищенным ресурсам.Я ошибочно меняю ключ безопасности с config.Value.key на config.Value.Issuer.Это работало раньше, поэтому я никогда не возвращался к этому методу.Этим утром я заметил сообщение, что подпись была недействительной.Я пошел к методу, который создает токен, и я осознаю свои ошибки.Я исправил и получаю 200, 401, 500 и 404. Как и ожидалось.

...