Angular 2 +ASP.NET CORE 2 + JWT AUTH TOKEN : ERROR:415 Unsuported media Type

296
27 декабря 2017, 18:13

Доброе время суток, на днях захотел разобраться с авторизацией на win api. Дело в том, что когда я посылаю данный токен, через Angular 2 ,точнее ангуляр его принимает, то я получаю ошибку ,что данный тип не поддерживается. В PostMan запрос воспринимается нормально. Ниже листинг программы: ASP.NET CORE:

       [HttpPost]
         public async Task Token([FromBody] Person person)
         {
         var username = person.Login;
         var password = person.Password;
        var identity = GetIdentity(username, password);
        if (identity == null)
        {
            Response.StatusCode = 400;
            await Response.WriteAsync("Invalid username or password.");
            return;
        }
        var now = System.DateTime.UtcNow;
        // создаем JWT-токен
        var jwt = new JwtSecurityToken(
                issuer: AuthOptions.ISSUER,
                audience: AuthOptions.AUDIENCE,
                notBefore: now,
                claims: identity.Claims,
                expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)),
                signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256));
        var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
        var response = new
        {
            access_token = encodedJwt,
            username = identity.Name
        };
        // сериализация ответа
        Response.ContentType = "application/json";
        await Response.WriteAsync(JsonConvert.SerializeObject(response, new JsonSerializerSettings { Formatting = Formatting.Indented }));
    }
    private ClaimsIdentity GetIdentity(string username, string password)
    {
        Person person = _context.Persons.FirstOrDefault(x => x.Login == username && x.Password == password);
        if (person != null)
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimsIdentity.DefaultNameClaimType, person.Login),
                new Claim(ClaimsIdentity.DefaultRoleClaimType, person.Role)
            };
            ClaimsIdentity claimsIdentity =
            new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType,
                ClaimsIdentity.DefaultRoleClaimType);
            return claimsIdentity;
        }
        // если пользователя не найдено
        return null;
    }

Класс Startup:

      services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.RequireHttpsMetadata = false;
                    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                        // укзывает, будет ли валидироваться издатель при валидации токена
                        ValidateIssuer = true,
                        // строка, представляющая издателя
                        ValidIssuer = AuthOptions.ISSUER,
                        // будет ли валидироваться потребитель токена
                        ValidateAudience = true,
                        // установка потребителя токена
                        ValidAudience = AuthOptions.AUDIENCE,
                        // будет ли валидироваться время существования
                        ValidateLifetime = true,
                        // установка ключа безопасности
                        IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
                        // валидация ключа безопасности
                        ValidateIssuerSigningKey = true,
                    };
                });

Непосредственно сам Angular:

    login() {
    this.loading = true;
    this.authenticationService.login(this.model.username, this.model.password)
        .subscribe(result => {
            if (result === true) {
                this.router.navigate(['/']);
            } else {
                this.error = 'Username or password is incorrect';
                this.loading = false;
            }
        });
}

Service :

   login(username: string, password: string): Observable<boolean> {
    console.log(JSON.stringify({ Login: username, password: password }));
    return this.http.post('api/account', JSON.stringify({ Login: username, password: password}))
        .map((response: Response) => {
            // login successful if there's a jwt token in the response
            let token = response.json() && response.json().token;
            if (token) {
                // set token property
                this.token = token;
                if (typeof window !== 'undefined') {
                    // store username and jwt token in local storage to keep user logged in between page refreshes
                    localStorage.setItem('currentUser', JSON.stringify({ username: username, token: token }));
                    // return true to indicate successful login
                    return true;
                }

        });
}

Так-же буду благодарен за советы поповоду,какие ещё можно авторизации для этой связки реализовать, всем спасибо.

Answer 1

Нужно было отправлять готовый объект, без конвертирования в JSON.

READ ALSO
Передача класса this

Передача класса this

Пытаюсь передать this (или саму форму по названию) в другой класс по событию CreateDatabase_Load или CreateDatabase_Shown

176
Парсинг HTML и разбор script по полочкам

Парсинг HTML и разбор script по полочкам

Если спарсил HTML код и в нём есть что подобное:

214
С# назначить кнопку через ComboBox для элемента

С# назначить кнопку через ComboBox для элемента

Здравствуйте, кто может подсказать и показать примерами как бы в роде простую задачку?

199