วิธีจัดการ (เพิ่ม) ผู้ใช้สำหรับแอปพลิเคชัน ASP.NET Core 3.1 จากภายนอก

ฉันขอโทษที่นี่จะไม่มีการระบุรหัสเพราะฉันพลาดแนวคิดนี้โดยสิ้นเชิง

บริบท: ฉันพัฒนาแอปพลิเคชั่นสองตัว ทั้ง ASP.NET Core 3.1 ให้เรียกพวกมันว่า A และ B

A คือเว็บไซต์ที่เปิดสู่อินเทอร์เน็ต เฉพาะผู้ใช้ที่มีบัญชีผู้ใช้ที่ถูกต้องเท่านั้นที่จะสามารถเข้าถึงได้ จะต้องไม่มีความเป็นไปได้ในการลงทะเบียนผู้ใช้หนึ่งรายภายในแอปพลิเคชัน A

B เป็นเว็บไซต์ภายใน (อินทราเน็ต) (การตรวจสอบสิทธิ์ด้วย Active Directory) จากแอปพลิเคชัน B ฉันต้องการให้สามารถสร้างผู้ใช้สำหรับแอปพลิเคชัน A ได้

แอปพลิเคชัน A ไม่เกี่ยวข้องกับ Active Directory ฉันใช้การดูแลระบบผู้ใช้ inbuild ปกติของ ASP.NET core

เป็นไปได้หรือไม่ที่จะป้อนผู้ใช้ไปยัง Application A จาก Application B โดยใช้ Entity Framework หรือมีแนวทางที่ดีกว่านี้ไหม? หากใช้งานได้กับ Entity Framework ฉันจะรับค่า Salt ที่แอปพลิเคชัน A ใช้เพื่อเกลือรหัสผ่านได้อย่างไร

เพื่อความชัดเจน: ฉันไม่มีคำถามเกี่ยวกับการรับรองความถูกต้องหรือการลงทะเบียนผู้ใช้สำหรับแอปพลิเคชัน B ซึ่งทั้งหมดนี้ใช้งานได้


comment
ดูเหมือนว่าคุณต้องการชี้ EF ใน Application B ของคุณไปยัง ASP.NET Membership DB ที่ Application A ฉันเชื่อว่าคุณสามารถมี DbContexts และสตริงการเชื่อมต่อได้หลายรายการในโครงการของคุณ   -  person timur    schedule 19.02.2020
comment
คุณถูกต้องกับสมมติฐานของคุณ ฉันหมายความว่ามันใช้งานได้แล้ว แต่ฉันไม่รู้ว่าฉันควรเกลือรหัสผ่านของผู้ใช้ที่ลงทะเบียนใหม่อย่างไรเพื่อให้แอปพลิเคชัน A สามารถตรวจสอบสิทธิ์ได้   -  person misanthrop    schedule 20.02.2020


คำตอบ (2)


คุณสามารถสร้างแฮชรหัสผ่านได้อย่างง่ายดายด้วยวิธีต่อไปนี้

public string CreateHash(TUser user, string password)
{
    var hasher = new PasswordHasher<TUser>();

    return (hasher.HashPassword(user, password));
}

วัตถุผู้ใช้จะต้องไม่เป็นวัตถุที่คุณต้องการเปลี่ยนรหัสผ่านด้วยซ้ำ

person schmityv    schedule 10.03.2020

เนื่องจากในความคิดเห็นที่คุณพูดถึง คุณค่อนข้างจะสนใจวิธีจัดเก็บเกลือ ฉันจะถือว่าคุณได้ให้ EF ชี้ไปที่ Application A ฐานข้อมูลสมาชิกที่ตั้งค่าไว้ และมุ่งเน้นไปที่บิตการแฮชนี้ ฉันจะถือว่าคุณใช้ UserManager เพื่อจัดการรหัสผ่านของคุณ

หากคุณดูว่ารหัสผ่านเป็นอย่างไร เก็บไว้ และ ได้รับการยืนยันแล้ว คุณจะสังเกตเห็นว่าการดำเนินการทั้งสองจบลงด้วยการอาศัย PasswordHasher เพื่อทำงาน มันถูกแทรกการพึ่งพาลงใน UserManager ของคุณโดยเฟรมเวิร์กและดูที่การใช้งาน:

private static byte[] HashPasswordV3(
      string password,
      RandomNumberGenerator rng,
      KeyDerivationPrf prf,
      int iterCount,
      int saltSize,
      int numBytesRequested)
    {
      byte[] numArray1 = new byte[saltSize];
      rng.GetBytes(numArray1);
      byte[] numArray2 = Microsoft.AspNetCore.Cryptography.KeyDerivation.KeyDerivation.Pbkdf2(password, numArray1, prf, iterCount, numBytesRequested);
      byte[] buffer = new byte[13 + numArray1.Length + numArray2.Length];
      buffer[0] = (byte) 1;

      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 1, (uint) prf); // hash type
      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 5, (uint) iterCount); // number of iterations
      PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 9, (uint) saltSize); // salt size (although not configurable in this implementation)
      Buffer.BlockCopy((Array) numArray1, 0, (Array) buffer, 13, numArray1.Length); // salt goes here
      Buffer.BlockCopy((Array) numArray2, 0, (Array) buffer, 13 + saltSize, numArray2.Length); // password hash goes here
      return buffer; // this gets Base64-encoded upstream
    }

ดูเหมือนว่าเกลือเป็นเพียงอาร์เรย์ 16 ไบต์แบบสุ่มที่ถูกเก็บไว้พร้อมกับ hash, hashing function และ number of iterations used ดังนั้นแฮชที่สร้างโดยแอปพลิเคชันหนึ่งจึงควรสามารถอ่านได้โดยอีกแอปพลิเคชันหนึ่งโดยไม่ต้องทำงานเพิ่มเติมใด ๆ ในนามของคุณตราบใดที่ PasswordHasherCompatibilityMode และ การสร้างระบบปฏิบัติการคือ เดียวกัน.

อีกสิ่งหนึ่งที่ควรทราบที่นี่ เนื่องจาก PasswordHasher คือ การพึ่งพาการฉีด คุณสามารถแทนที่มันด้วยการนำไปใช้งานของคุณเองได้หากจำเป็น หวังว่าจะพูดถึง PasswordHasher ให้บริบทแก่คุณอย่างเพียงพอ

person timur    schedule 21.02.2020
comment
ขอบคุณคุณติมูร์. ค่าหัวกำลังจะหมดเวลาแล้ว ฉันจึงมอบมันให้กับคุณ อย่างไรก็ตาม ฉันยังไม่ได้ยืนยันคำตอบของคุณ อย่างไรก็ตามขอขอบคุณสำหรับความพยายามของคุณ ฉันจะลองข้อเสนอแนะของคุณโดยเร็วที่สุด - person misanthrop; 24.02.2020