TL; ดร
IdentityServer = บริการเข้ารหัสโทเค็นและตรวจสอบความถูกต้องผ่าน OAuth 2.0 / OpenId-Connect
ASP.NET Identity = กลยุทธ์การจัดการข้อมูลประจำตัวปัจจุบันใน ASP.NET
ฉันจะตรวจสอบความถูกต้องคล้ายกับวิธีที่ทำใน. Net เวอร์ชันก่อนหน้าได้อย่างไรวิธีเก่ายังใช้งานได้หรือมีเวอร์ชันที่ใหม่กว่า
ฉันไม่เห็นเหตุผลว่าทำไมคุณถึงไม่สามารถบรรลุแนวทางเดิมใน ASP.NET Core ได้ แต่โดยทั่วไปแล้วกลยุทธ์นั้นถูกแทนที่ด้วย ASP.NET Identity และ ASP.NET Identity นั้นยังมีชีวิตอยู่และดีใน ASP.NET Core
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity
ASP.NET Identity ใช้ที่เก็บสำรองเช่น SQL Server เพื่อเก็บข้อมูลผู้ใช้เช่นชื่อผู้ใช้รหัสผ่าน (แฮช) อีเมลโทรศัพท์และสามารถขยายเพื่อเก็บ FirstName, LastName หรือสิ่งอื่น ๆ ได้อย่างง่ายดาย ดังนั้นจึงไม่มีเหตุผลที่จะเข้ารหัสข้อมูลผู้ใช้ลงในคุกกี้และส่งผ่านไปมาจากไคลเอนต์ไปยังเซิร์ฟเวอร์ สนับสนุนแนวคิดเช่นการอ้างสิทธิ์ของผู้ใช้โทเค็นผู้ใช้บทบาทของผู้ใช้และการเข้าสู่ระบบภายนอก นี่คือเอนทิตีใน ASP.NET Identity:
- AspNetUsers
- AspNetUserRoles
- AspNetUserClaims
- AspNetUserLogins (สำหรับการเชื่อมโยงผู้ให้บริการข้อมูลประจำตัวภายนอกเช่น Google, AAD)
- AspNetUserTokens (สำหรับเก็บสิ่งต่างๆเช่น access_tokens และ refresh_tokens ที่รวบรวมโดยผู้ใช้)
ข้อดีข้อเสียของการใช้ข้อตกลงเซิร์ฟเวอร์โทเค็นของคุณเองที่สร้างหลักการของคุณเองคืออะไร?
เซิร์ฟเวอร์โทเค็นจะเป็นระบบที่สร้างโครงสร้างข้อมูลง่ายๆที่มีข้อมูลการอนุญาตและ / หรือการพิสูจน์ตัวตน การอนุมัติมักจะใช้เวลาสำหรับของชื่อโทเค็นACCESS_TOKEN นี่จะเป็น "กุญแจสู่บ้าน" ดังนั้นหากต้องการพูดให้คุณเดินผ่านประตูบ้านและเข้าไปในที่อยู่อาศัยของทรัพยากรที่ได้รับการคุ้มครองโดยปกติจะเป็นเว็บ API สำหรับการพิสูจน์ตัวตนจะid_token
มีตัวระบุเฉพาะสำหรับผู้ใช้ / บุคคล ในขณะที่มันเป็นเรื่องธรรมดาที่จะนำตัวบ่งชี้ดังกล่าวใน ACCESS_TOKEN ที่มีอยู่ในขณะนี้โปรโตคอลเฉพาะสำหรับการทำที่: OpenID-Connect
เหตุผลที่ต้องมี Security Token Service (STS) ของคุณเองคือเพื่อปกป้องทรัพย์สินข้อมูลของคุณผ่านการเข้ารหัสและควบคุมว่าไคลเอนต์ (แอปพลิเคชัน) ใดที่สามารถเข้าถึงทรัพยากรเหล่านั้นได้ นอกจากนี้มาตรฐานสำหรับการควบคุมข้อมูลประจำตัวยังมีอยู่ในข้อกำหนดของ OpenID-Connect IdentityServer เป็นตัวอย่างของ OAuth 2.0 Authorization Server ที่รวมกับเซิร์ฟเวอร์ OpenID-Connect Authentication
แต่สิ่งนี้ไม่จำเป็นหากคุณต้องการเพียงแค่ตารางผู้ใช้ในแอปพลิเคชันของคุณ คุณไม่จำเป็นต้องมีเซิร์ฟเวอร์โทเค็นเพียงแค่ใช้ ASP.NET Identity ASP.NET Identity จับคู่ผู้ใช้ของคุณกับอ็อบเจ็กต์ClaimsIdentityบนเซิร์ฟเวอร์ - ไม่จำเป็นต้องมีคลาส IPrincipal ที่กำหนดเอง
เมื่อใช้โซลูชันบนคลาวด์หรือเซิร์ฟเวอร์โทเค็นแยกต่างหากคุณจะรวมเข้ากับแอปพลิเคชันปัจจุบันของคุณได้อย่างไรฉันจะยังต้องการตารางผู้ใช้ในแอปพลิเคชันของฉันคุณจะเชื่อมโยงทั้งสองได้อย่างไร
ดูบทช่วยสอนเหล่านี้สำหรับการผสานรวมโซลูชันข้อมูลประจำตัวแยกกับแอปพลิเคชัน:
https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html
https://auth0.com/docs/quickstart/webapp/aspnet-core
อย่างน้อยที่สุดคุณจะต้องมีตารางสองคอลัมน์ที่แมปชื่อผู้ใช้กับตัวระบุผู้ใช้ของผู้ให้บริการภายนอก นี่คือสิ่งที่ตาราง AspNetUserLogins ทำใน ASP.NET Identity อย่างไรก็ตามแถวในตารางนั้นขึ้นอยู่กับการเป็นระเบียนผู้ใช้ใน AspNetUsers
ASP.NET Identity รองรับผู้ให้บริการภายนอกเช่น Google, Microsoft, Facebook, ผู้ให้บริการ OpenID-Connect, Azure AD มีอยู่แล้ว (Google และ Microsoft ได้ติดตั้งโปรโตคอล OpenID-Connect แล้วดังนั้นคุณจึงไม่จำเป็นต้องใช้แพ็คเกจการรวมที่กำหนดเองเช่นนี้ ) นอกจากนี้ ADFS ยังไม่พร้อมใช้งานบน ASP.NET Core Identity
ดูเอกสารนี้เพื่อเริ่มต้นกับผู้ให้บริการภายนอกใน ASP.NET Identity:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
เนื่องจากมีโซลูชันที่แตกต่างกันมากมายฉันจะสร้างแอปพลิเคชันสำหรับองค์กรได้อย่างไรเพื่ออนุญาตให้เข้าสู่ระบบผ่าน Gmail / Facebook ในขณะที่ยังสามารถขยายไปยัง SSO อื่น ๆ ได้
ตามที่อธิบายไว้ข้างต้น ASP.NET Identity ทำสิ่งนี้อยู่แล้ว การสร้างตาราง "ผู้ให้บริการภายนอก" ค่อนข้างง่ายและข้อมูลจะขับเคลื่อนกระบวนการเข้าสู่ระบบภายนอกของคุณ ดังนั้นเมื่อมี "SSO" ใหม่ให้เพิ่มแถวใหม่ที่มีคุณสมบัติเช่น url ของผู้ให้บริการรหัสไคลเอ็นต์และข้อมูลลับที่ให้คุณ ASP.NET Identity มี UI อยู่แล้วในเทมเพลต Visual Studio แต่โปรดดูที่ปุ่มเข้าสู่ระบบทางสังคมสำหรับปุ่มที่เย็น
สรุป
หากคุณต้องการเพียงแค่ตารางผู้ใช้ที่มีความสามารถในการลงชื่อเข้าใช้ด้วยรหัสผ่านและโปรไฟล์ผู้ใช้ ASP.NET Identity ก็สมบูรณ์แบบ ไม่จำเป็นต้องเกี่ยวข้องกับหน่วยงานภายนอก แต่หากมีแอปพลิเคชันจำนวนมากที่ต้องการเข้าถึง apis จำนวนมากผู้มีอำนาจอิสระในการรักษาความปลอดภัยและตรวจสอบข้อมูลประจำตัวและการเข้าถึงโทเค็นก็สมเหตุสมผล IdentityServer เหมาะหรือดูopeniddict-coreหรือAuth0สำหรับโซลูชันระบบคลาวด์
คำขอโทษของฉันคือสิ่งนี้ไม่ได้กดปุ่มเครื่องหมายหรือเป็นการเกริ่นเกินไป โปรดอย่าลังเลที่จะโต้ตอบเพื่อไปยังวัวตาเดียวที่คุณกำลังมองหา
ภาคผนวก: การตรวจสอบสิทธิ์คุกกี้
หากต้องการตรวจสอบสิทธิ์แบบเปลือยด้วยคุกกี้ให้ทำตามขั้นตอนเหล่านี้ แต่สำหรับความรู้ของฉันไม่สนับสนุนหลักการเรียกร้องที่กำหนดเอง เพื่อให้ได้ผลเช่นเดียวกันใช้รายการการอ้างสิทธิ์ของClaimPrincipal
วัตถุ
สร้างเว็บแอปพลิเคชัน ASP.NET Core 1.1 ใหม่ใน Visual Studio 2015/2017 โดยเลือก "No Authentication" ในกล่องโต้ตอบ จากนั้นเพิ่มแพ็คเกจ:
Microsoft.AspNetCore.Authentication.Cookies
ภายใต้Configure
วิธีการStartup.cs
นี้ (ก่อนหน้าapp.UseMvc
):
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new PathString("/Controller/Login/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
จากนั้นสร้าง UI สำหรับเข้าสู่ระบบและโพสต์ฟอร์ม html ไปยัง Action Method ดังนี้:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim("FirstName", "Alice"),
new Claim("LastName", "Smith")
};
var identity = new ClaimsIdentity(claims, "Password");
var principal = new ClaimsPrincipal(identity);
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError(String.Empty, "Invalid login attempt.");
return View();
}
อ็อบเจ็กต์ HttpContext.User ควรมีการอ้างสิทธิ์ที่กำหนดเองของคุณและสามารถเรียกคืนคอลเล็กชัน List ของ ClaimPrincipal ได้อย่างง่ายดาย
ฉันหวังว่าสิ่งนี้จะเพียงพอเนื่องจากโซลูชัน / โครงการเต็มรูปแบบดูเหมือนจะค่อนข้างมากสำหรับโพสต์ StackOverflow