JSON Web token oraz Asp MVC Web Api

Odpowiedz Nowy wątek
2017-11-05 16:37
0

Hej.

Chciałbym dołożyć sobie JSON Web Token do mojego prostego Web API.

Mam taki WebApi Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPIExample.Models;

namespace WebAPIExample.Controllers
{
    public class EmployeeController : ApiController
    {
        // GET: api/Products
        public IEnumerable<Employee> Get()
        {
            List<Employee> peopelesList = new List<Employee>()
            {
                new Employee() { ID = 1, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
                new Employee() { ID = 2, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
                new Employee() { ID = 3, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
            };

            return peopelesList;
        }

        // GET: api/Products/5
        public Employee Get(int id)
        {
            List<Employee> peopelesList = new List<Employee>()
            {
                new Employee() { ID = 1, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
                new Employee() { ID = 2, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
                new Employee() { ID = 3, Login = "prod1", Password = "pass1", FirstName = "asdasd", LastName = "asdasd", Salary = 21321423},
            };

            return peopelesList.Where(n => n.ID == id).FirstOrDefault();
        }

        // POST: api/Products
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/Products/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/Products/5
        public void Delete(int id)
        {
        }
    }
}

Chciałbym zaszyfrować sobie przesyłane dane na przykład GETem przy użyciu JSON Web Token.

Wiecie jak zaaplikować go do swojego Web API?


Zaszyfrować przez JWT? Zawsze mi się wydawało, że on służy do uwierzytelniania bardziej? - Ktos 2017-11-05 17:04
W internecie jest masa przykładów z takim zadaniem. Czego oczekujesz jako autor tego posta? Że ktoś krok po kroku, przez godzinę będzie Ci tłumaczył jak masz to zaimplementowac? - Młodszy Programista 2017-11-05 17:41
Dzięki chłopaki, zawsze można na Was liczyć. Właśnie szukam na różnych blogach (jest masa przykładów) ale nie mam jakoś pomysłu jak to u siebie zaincludować. Chciałbym wykorzystać ten JSWT w jakiś sposób gdy podaje sobie login i hasło to zwraca mi odpowiedniego Employee. (Generuje sobie token) ale nie wiem jak to zrobić. - Odyn 2017-11-05 19:05

Pozostało 580 znaków

2017-11-05 19:04
0

Dzięki chłopaki, zawsze można na Was liczyć.

Troche poprawiłem swoje API, wyciągam sobie Employee z bazy danych:

public class EmployeeController : ApiController
    {
        ApplicationDbContext _context = new ApplicationDbContext();
        AuthenticationService _authService = new AuthenticationService();

        // GET: api/Products
        [HttpGet]
        public IEnumerable<Employee> Get()
        {
            var allEmployee = _context.Employee.ToList();

            return allEmployee;
        }

        // GET: api/Products/5
        [HttpGet]
        public Employee Get(int id)
        {
            var getEmployee = _context.Employee.ToList().Where(n => n.ID == id).First();

            return getEmployee;
        }

        // GET: api/Products/5
        [HttpGet]
        public Employee Get(string login, string password)
        {
            var authenticationResult = _authService.AuthenticateUser(login, password);

            if (authenticationResult)
            {
                return _context.Employee.ToList().Where(n => n.Login == login).First();
            }

            throw new HttpResponseException(HttpStatusCode.Unauthorized);
        }
    }

Chciałbym aby w jakiś sposób wykorzystać tutaj JSON Web Token np. aby po wykonaniu requesta w którym przekaże sobie login i hasło, wygenerował się token i zwróciły się odpowiednie zasoby.

Czyli wpisuje sobie request: "http://localhost:46087/api/Em[...]@gmail.com&password=test1"

I jeśli to hasło jest poprawne to generuje JSON Web Token i dopiero wtedy zwracam sobie zasoby.

Generalnie w tej chwili działa to tak, że jak hasło i login jest poprawny to zwraca odpowiedniego JSONa z bazy danych. Natomiast gdy hasło nie jest poprawne to nie dzieje się nic ale również nic się nie zwraca :P

Jak wsadzić w to JSON Web token?


Pozostało 580 znaków

2017-11-05 19:24
0

W najprostszym przypadku robisz sobie endpoint do pobrania tokenu, który przyjmuje login i hasło. Jeśli dane się zgadzają, to generujesz token wsadzając do środka to co jest ci potrzebne (claims) - np. czas ważności/role/id użytkownika, a na końcu podpisujesz to HMACSHA256 (najczęściej), żeby mieć pewność, że nikt sam nie wygeneruje sobie takiego tokena.

Teraz WebApi konfigurujesz, żeby jako uwierzytelnianie używało tego tokena i manipulujesz sobie atrybutem [Authorize] na kontrolerach/akcjach, do których dostęp ma być ograniczony.

Poszukaj jakichś bibliotek, pewnie do tego są.

PS. Sam kontroler nie powinien już nic wiedzieć o sposobie uwierzytelniania, więc nie musisz go wklejać :P

Pozostało 580 znaków

2017-11-05 19:33
0

Piszesz w ASP.NET Core? Bo ja dla .NET Core 2.0 mam zrobione to mniej więcej tak, jak tutaj: https://medium.com/@lugrugzo/[...]h-identity-mysql-3698eeba6ff8, uwierzytelnianiem już zajmuje się zwykłe [Authorize], a dokładnie:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
public class EanApiController : Controller
edytowany 1x, ostatnio: Ktos, 2017-11-05 19:34

Pozostało 580 znaków

2017-11-09 13:51

Dzięki chłopaki. Mam to już ogarniętę.

Wykorzystałem OAuth2 oraz Bearer Token.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0