สร้างโปรเจ็กส์แบบ mvc ใช้ JWT, Identity service และ Seed ข้อมูล

สร้างโปรเจ็กส์แบบ mvc

> mkdir grocery
> cd grocery
> dotnet new mvc

รันด้วย Visual Studio 2017 ได้ https://localhost:44330/

เพิ่ม package ที่ต้องใช้

dotnet add package JWT -v 3.0.0-beta4
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Models/GroceryItem.cs

Models/Credentials.cs

จริงๆไฟล์ JWTSettings.cs ควรอยู่ที่ root directory ไม่ใช่ใน Models
Models/JWTSettings.cs

สร้างโฟลเดอร์ Data

Data/GroceryListContext.cs

Data/UserDbContext.cs

บรรทัดที่ 12 : น่าจะเป็นการบังคับสร้างดาต้าเบส โดยไม่ต้องมาใช้คำสั่ง dotnet ef database update

Controllers/GroceryListController.cs

Controllers/AccountController.cs

บรรทัดที่ 84 : กำหนดให้ token หมดอายุใน 7 วัน

Controllers/BooksController.cs

Startup.cs

บรรทัดที่ 58-71 : Validating JWTs with ASP.NET Core

appsettings.json

SecretKey ใช้ sign โทเคน และ validate โทเคน

รัน F5

Register ผู้ใช้งาน

ใช้ Postman ทำการ POST ไปที่
https://localhost:44330/api/account

{
    "email": "mr.phaisarn@gmail.com",
    "password": "123456#User"
}

ผลลัพธ์

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtci5waGFpc2FybkBnbWFpbC5jb20iLCJlbWFpbCI6Im1yLnBoYWlzYXJuQGdtYWlsLmNvbSIsImlzcyI6ImRvdG5ldF9ncm9jZXJ5X2xpc3QiLCJhdWQiOiJHcm9jZXJ5TGlzdEFQSSIsIm5iZiI6MTUzOTcwNTE3NC4wLCJpYXQiOjE1Mzk3MDUxNzQuMCwiZXhwIjoxNTQwMzA5OTc0LjB9.KlW5XgthP9_fsbHfx_Vtcf-7PDxwt5TrjVLlO9aMVi8",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjBkYjNmZmU4LTlkYWEtNGE4OC1iN2JkLTNhNjU2YTc0NDNjYSIsInN1YiI6Im1yLnBoYWlzYXJuQGdtYWlsLmNvbSIsImVtYWlsIjoibXIucGhhaXNhcm5AZ21haWwuY29tIiwiZW1haWxDb25maXJtZWQiOmZhbHNlLCJpc3MiOiJkb3RuZXRfZ3JvY2VyeV9saXN0IiwiYXVkIjoiR3JvY2VyeUxpc3RBUEkiLCJuYmYiOjE1Mzk3MDUxNzQuMCwiaWF0IjoxNTM5NzA1MTc0LjAsImV4cCI6MTU0MDMwOTk3NC4wfQ.Jb7AvFsj8JnhjVxc9Ztgf-EDs8Hkf1DWo9XmQsEgyD8"
}

การ log-in เข้าใช้งาน

ใช้ Postman ทำการ POST ไปที่
https://localhost:44330/api/account/sign-in

{
    "email": "mr.phaisarn@gmail.com",
    "password": "123456#User"
}

ผลลัพธ์

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtci5waGFpc2FybkBnbWFpbC5jb20iLCJlbWFpbCI6Im1yLnBoYWlzYXJuQGdtYWlsLmNvbSIsImlzcyI6ImRvdG5ldF9ncm9jZXJ5X2xpc3QiLCJhdWQiOiJHcm9jZXJ5TGlzdEFQSSIsIm5iZiI6MTUzOTcwNTI2NS4wLCJpYXQiOjE1Mzk3MDUyNjUuMCwiZXhwIjoxNTQwMzEwMDY1LjB9.Ujy0vd05kFiI_8yZd-INpAleUdG1ruSFS5iZfMq6O8E",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjBkYjNmZmU4LTlkYWEtNGE4OC1iN2JkLTNhNjU2YTc0NDNjYSIsInN1YiI6Im1yLnBoYWlzYXJuQGdtYWlsLmNvbSIsImVtYWlsIjoibXIucGhhaXNhcm5AZ21haWwuY29tIiwiZW1haWxDb25maXJtZWQiOmZhbHNlLCJpc3MiOiJkb3RuZXRfZ3JvY2VyeV9saXN0IiwiYXVkIjoiR3JvY2VyeUxpc3RBUEkiLCJuYmYiOjE1Mzk3MDUyNjUuMCwiaWF0IjoxNTM5NzA1MjY1LjAsImV4cCI6MTU0MDMxMDA2NS4wfQ.h0WFsop4kFwweSAsxmOEAnGjrJNVpkWNfXOUlcwwJF8"
}

นำ access_token มาใช้ขอ รายการหนังสือ

ใช้ Postman ทำการ GET ไปที่
https://localhost:44330/api/books
และส่ง access_token ไปด้วย

Error Message

If we start the application now, and issue an HTTP GET request to any endpoint of the GroceryListController class, we will get a 404 (Not Found) response from the server. You would probably expect a 401 (Unauthorized) answer, but 404 was sent back because when a user is not logged in they are redirect to a login web page. This web page is not provided by default by ASP.NET Core, and therefore the request ends up being answered with a 404 response.

Although we have secured our precious endpoints, we are not ready yet. Even if we send the access_token in a HTTP request, we are still going to get a 401 answer, because we have not configured our application to validate JWTs. Let’s tackle this issue now.

 

Link