Simple ASP.NET Authorization Boilerplate Project ไม่มี EF ไม่มีฐานข้อมูลไม่มี IdentityServer4 ไม่มีที่เก็บเซสชันเพียงแค่การบันทึกขั้นพื้นฐานในระบบสำหรับทั้งคุกกี้และ JWT ที่มีนโยบายการอนุญาตสองอย่างและคอนโทรลเลอร์พร้อมชุดตัวอย่าง อัปเดตเมื่อเร็ว ๆ นี้เป็น. NET 8
ในการลุกขึ้นและเรียกใช้เพียงแค่ cd ไปยังรูทที่ไฟล์ .csproj อยู่และเรียกใช้คำสั่งต่อไปนี้
cd examples/cookies+api
dotnet run
แอพจำลองระบบผู้ดูแลระบบพื้นฐานกลุ่มพื้นฐาน มีผู้ใช้สามกลุ่มที่สามารถเป็นสมาชิกของ: users , superusers และ admins ผู้ใช้ทุกคนเป็นสมาชิกของกลุ่ม users แต่ไม่ใช่ทั้งหมดเป็นสมาชิกของ superusers และหรือ admins และมีบางส่วนของแอพที่ใช้ Authorize อนุญาตโดยใช้นโยบายการเข้าถึงการเข้าถึงตัวกรอง
มีชุดของการเข้าสู่ระบบเพื่อทดสอบ โฮมเพจมีตารางของผู้ใช้และรหัสผ่านที่มีอยู่และระบุว่าผู้ใช้เป็นสมาชิกของ superusers และ / หรือ admins หรือไม่

จากนั้นคุณสามารถเรียกใช้ชุดการทดสอบด้านล่างและดูว่าส่วนใดที่คุณสามารถดูขึ้นอยู่กับการเข้าสู่ระบบ การทดสอบทั้งหมดทำการโทรไปยังคลาส ExampleController
เรียกดู http://localhost/auth และหากคุณเข้าสู่ระบบภายใต้ผู้ใช้ใด ๆ คุณควรดูสิ่งต่อไปนี้
Only authenticated cookie based requests from superusers receive this message.
เรียกดู http://localhost/superuser และหากคุณเข้าสู่ระบบภายใต้ผู้ใช้ใน superusers หรือ admins คุณควรเห็นสิ่งต่อไปนี้
Only authenticated cookie based requests from superusers receive this message.
เรียกดู http://localhost/admin และหากคุณเข้าสู่ระบบภายใต้ผู้ใช้ใน admins คุณควรเห็นสิ่งต่อไปนี้
Only authenticated cookie based requests from admins receive this message.
คำสั่งแรกได้รับโทเค็นซึ่งจะต้องใช้สำหรับคำขอที่ตามมา ในตัวอย่างด้านล่างผู้ admin ที่ใช้รหัสผ่านใช้ password แต่มีการเข้าสู่ระบบอื่น ๆ เพื่อทดสอบซึ่งจะให้ผลลัพธ์ที่แตกต่างกัน
curl -X POST http://localhost:5000/api/login -H "Content-Type: application/x-www-form-urlencoded" -d "Name=admin&Password=password"
คำสั่งข้างต้นควรส่งผลให้สิ่งที่คล้ายกับต่อไปนี้ (เห็นได้ชัดว่าค่าโทเค็นจะแตกต่างกัน)
{
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBkb21haW4iLCJqdGkiOiJkNGM5MDE0Zi0zOGYxLTQ3NTItODU3YS03ZTc0YzU0MjY3ZDciLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJhZG1pbnMiOiIxIiwic3VwZXJ1c2VycyI6IjIiLCJ1c2VycyI6IjMiLCJleHAiOjE1MDQzODk0NTEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaS8ifQ.gFnf39Vj16vEmcI1HdwPajH6sRHusxtjZ2eh0Xc1cJs"
}
ค่าโทเค็นจะถูกใช้กับคำขอที่ตามมา สำหรับตัวอย่างด้านล่างแทนที่ TOKEN_VALUE โดยไม่ว่าจะเป็นค่าใดก็ตามจากขั้นตอนข้างต้น
curl http://localhost:5000/api/auth -H "Authorization: Bearer TOKEN_VALUE"
ไม่ว่าโทเค็นของผู้ใช้จะเป็นอย่างไรสำหรับคุณควรเห็นสิ่งต่อไปนี้
Only authenticated token based requests receive this message.
การทดสอบต่อไปนี้จะใช้ได้กับผู้ใช้ใน superusers หรือ admins
curl http://localhost:5000/api/superuser -H "Authorization: Bearer TOKEN_VALUE"
คำสั่งข้างต้นควรสร้างสิ่งต่อไปนี้
Only authenticated token based requests from superusers receive this message.
การทดสอบต่อไปนี้จะใช้ได้กับผู้ใช้ใน admins
curl http://localhost:5000/api/admin -H "Authorization: Bearer TOKEN_VALUE"
คำสั่งข้างต้นควรสร้างสิ่งต่อไปนี้
Only authenticated token based requests from admins receive this message.
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการจัดการ JWT รหัสอยู่ในวิธี TokenInfo ของคลาส ExampleController
curl http://localhost:5000/api/tokeninfo -H "Authorization: Bearer TOKEN_VALUE"
ผู้ใช้ที่ได้รับการรับรองความถูกต้องควรนำเสนอด้วยสิ่งที่คล้ายกับสิ่งต่อไปนี้
{
"token":{
"actor":null,
"audiences":[
"http://localhost:5000/api/"
],
"claims":[
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"sub",
"value":"admin@domain",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"jti",
"value":"f85815ae-69c4-4fec-8553-bc1199e3cdce",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",
"value":"admin",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"admins",
"value":"1",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"superusers",
"value":"2",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"users",
"value":"3",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"exp",
"value":"1504392381",
"valueType":"http://www.w3.org/2001/XMLSchema#integer"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"iss",
"value":"http://localhost:5000/api/",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
},
{
"issuer":"http://localhost:5000/api/",
"originalIssuer":"http://localhost:5000/api/",
"properties":{
},
"subject":null,
"type":"aud",
"value":"http://localhost:5000/api/",
"valueType":"http://www.w3.org/2001/XMLSchema#string"
}
],
"encodedHeader":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"encodedPayload":"eyJzdWIiOiJhZG1pbkBkb21haW4iLCJqdGkiOiJmODU4MTVhZS02OWM0LTRmZWMtODU1My1iYzExOTllM2NkY2UiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJhZG1pbnMiOiIxIiwic3VwZXJ1c2VycyI6IjIiLCJ1c2VycyI6IjMiLCJleHAiOjE1MDQzOTIzODEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaS8ifQ",
"header":{
"alg":"HS256",
"typ":"JWT"
},
"id":"f85815ae-69c4-4fec-8553-bc1199e3cdce",
"issuer":"http://localhost:5000/api/",
"payload":{
"sub":"admin@domain",
"jti":"f85815ae-69c4-4fec-8553-bc1199e3cdce",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name":"admin",
"admins":"1",
"superusers":"2",
"users":"3",
"exp":1504392381,
"iss":"http://localhost:5000/api/",
"aud":"http://localhost:5000/api/"
},
"innerToken":null,
"rawAuthenticationTag":null,
"rawCiphertext":null,
"rawData":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBkb21haW4iLCJqdGkiOiJmODU4MTVhZS02OWM0LTRmZWMtODU1My1iYzExOTllM2NkY2UiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJhZG1pbnMiOiIxIiwic3VwZXJ1c2VycyI6IjIiLCJ1c2VycyI6IjMiLCJleHAiOjE1MDQzOTIzODEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaS8ifQ.AXpvgAE3ZFN8EnRVSkLUt0iCaFTySFnMTfSx_kWYFDk",
"rawEncryptedKey":null,
"rawInitializationVector":null,
"rawHeader":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"rawPayload":"eyJzdWIiOiJhZG1pbkBkb21haW4iLCJqdGkiOiJmODU4MTVhZS02OWM0LTRmZWMtODU1My1iYzExOTllM2NkY2UiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJhZG1pbnMiOiIxIiwic3VwZXJ1c2VycyI6IjIiLCJ1c2VycyI6IjMiLCJleHAiOjE1MDQzOTIzODEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaS8ifQ",
"rawSignature":"AXpvgAE3ZFN8EnRVSkLUt0iCaFTySFnMTfSx_kWYFDk",
"securityKey":null,
"signatureAlgorithm":"HS256",
"signingCredentials":null,
"encryptingCredentials":null,
"signingKey":null,
"subject":"admin@domain",
"validFrom":"0001-01-01T00:00:00",
"validTo":"2017-09-02T22:46:21Z"
}
}
ที่อยู่ http://localhost/auth มีให้สำหรับทั้งการเข้าสู่ระบบคุกกี้และ JWT และผู้ใช้ควรดูข้อความต่อไปนี้หลังจากดำเนินการ
Only authenticated requests receive this message.