JSON Web token oraz Asp MVC Web Api

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?

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/Employee?login=[email protected]&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?

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

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/asp-net-core-2-0-webapi-jwt-authentication-with-identity-mysql-3698eeba6ff8, uwierzytelnianiem już zajmuje się zwykłe [Authorize], a dokładnie:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
public class EanApiController : Controller
0

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

Wykorzystałem OAuth2 oraz Bearer Token.

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