IUserSecurityStampStore <TUser> ของ ASP.NET Identity คืออะไร


178

ดู ASP.NET Identity (การเป็นสมาชิกใหม่ใน ASP.NET) ฉันเจออินเทอร์เฟซนี้เมื่อใช้งานของตัวเองUserStore:

//Microsoft.AspNet.Identity.Core.dll

namespace Microsoft.AspNet.Identity
{ 
    public interface IUserSecurityStampStore<TUser> :
    {
        // Methods
        Task<string> GetSecurityStampAsync(TUser user);
        Task SetSecurityStampAsync(TUser user, string stamp);
    }
}

IUserSecurityStampStoreถูกนำมาใช้โดยค่าเริ่มต้นEntityFramework.UserStore<TUser>ซึ่งเป็นหลักและได้รับการตั้งค่าTUser.SecurityStampคุณสมบัติ

หลังจากการขุดเพิ่มเติมปรากฏว่า a SecurityStampคือสิ่งGuidที่สร้างขึ้นใหม่ที่ประเด็นสำคัญในUserManager(ตัวอย่างเช่นการเปลี่ยนรหัสผ่าน)

ฉันไม่สามารถจริงๆถอดรหัสมากเกินนี้ตั้งแต่ผมตรวจสอบรหัสนี้ในการสะท้อนแสง ข้อมูลสัญลักษณ์และ async เกือบทั้งหมดได้รับการปรับให้เหมาะสม

นอกจากนี้ Google ยังไม่ได้รับความช่วยเหลือมากนัก

คำถามคือ:

  • คืออะไรSecurityStampใน ASP.NET เอกลักษณ์และสิ่งที่มันใช้?
  • ที่ไม่SecurityStampเล่นบทบาทใด ๆ เมื่อคุกกี้รับรองความถูกต้องจะถูกสร้างขึ้น?
  • มีข้อ จำกัด ด้านความปลอดภัยหรือข้อควรระวังที่จำเป็นต้องดำเนินการหรือไม่? ตัวอย่างเช่นอย่าส่งค่านี้ต่อเนื่องให้กับลูกค้าหรือไม่

อัปเดต (9/16/2014)

มีซอร์สโค้ดที่นี่:


1
@TryingToImprove, Identity store ใหม่และมิดเดิลแวร์ OWIN ที่ขึ้นต่อกันได้รับการออกแบบมาให้ปรับแต่งได้สูง เช่นเดียวกับ SimpleMembership มีการออกจากกล่องการดำเนินการใช้ประโยชน์จาก EF ล่าสุดเกี่ยวกับ SQL ด่วน แต่ Schema, วิธีการสืบค้นข้อมูล, แหล่งฐานข้อมูลและแม้แต่มิดเดิลแวร์สามารถปรับแต่งได้รอบ ๆ รูม่านตาเฉพาะของคุณ ยิ่งไปกว่านั้นการใช้งานที่วางจำหน่ายโดย MS นั้นยังคงพัฒนาอยู่ นั่นเป็นเหตุผลที่ทุกคนพยายามค้นหาคำจำกัดความที่เฉพาะเจาะจง
Dave Alperovich

คำตอบ:


224

สิ่งนี้มีไว้เพื่อแสดงภาพรวมปัจจุบันของข้อมูลรับรองผู้ใช้ของคุณ ดังนั้นหากไม่มีอะไรเปลี่ยนแปลงแสตมป์จะยังคงเหมือนเดิม แต่ถ้ารหัสผ่านของผู้ใช้มีการเปลี่ยนแปลงหรือลบการเข้าสู่ระบบ (ยกเลิกการเชื่อมโยงบัญชี Google / fb ของคุณ) การประทับจะเปลี่ยน สิ่งนี้จำเป็นสำหรับสิ่งต่าง ๆ เช่นการลงชื่อผู้ใช้โดยอัตโนมัติ / ปฏิเสธคุกกี้เก่าเมื่อเกิดเหตุการณ์นี้ซึ่งเป็นคุณลักษณะที่มาใน 2.0

ตัวตนยังไม่เปิดแหล่งที่มาปัจจุบันยังอยู่ในท่อยังคง

แก้ไข: อัปเดตสำหรับ 2.0.0 ดังนั้นวัตถุประสงค์หลักของการSecurityStampคือการเปิดใช้งานออกจากทุกที่ แนวคิดพื้นฐานคือเมื่อใดก็ตามที่มีการเปลี่ยนแปลงความปลอดภัยที่เกี่ยวข้องกับผู้ใช้เช่นรหัสผ่านเป็นความคิดที่ดีที่จะทำให้การลงชื่อเข้าใช้คุกกี้ที่มีอยู่โดยอัตโนมัติเป็นโมฆะดังนั้นหากรหัสผ่าน / บัญชีของคุณถูกบุกรุก

ใน 2.0.0 เราได้เพิ่มการกำหนดค่าต่อไปนี้เพื่อขอOnValidateIdentityวิธีการในCookieMiddlewareเพื่อดูSecurityStampและปฏิเสธคุกกี้เมื่อมีการเปลี่ยนแปลง นอกจากนี้ยังรีเฟรชการอ้างสิทธิ์ของผู้ใช้จากฐานข้อมูลโดยอัตโนมัติทุกครั้งrefreshIntervalหากการประทับไม่เปลี่ยนแปลง

app.UseCookieAuthentication(new CookieAuthenticationOptions {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

หากแอปของคุณต้องการเรียกใช้พฤติกรรมนี้อย่างชัดเจนแอปสามารถโทร:

UserManager.UpdateSecurityStampAsync(userId);

1
ถ้าฉันย้ายข้อมูลจากโครงสร้างตาราง MVC4 ฉันจะปล่อยให้ฟิลด์นั้นว่างเปล่าได้ไหม? หรือว่าจะทำให้บางสิ่งบางอย่างผิดพลาด
Dmytro Shevchenko

1
คุณสามารถให้มันคืนค่า ID หรือบางสิ่งบางอย่างคงที่เพื่อทำให้มันไม่มีประสิทธิภาพ Null / "" อาจใช้ได้เช่นกัน
Hao Kung

2
UserManager.UpdateSecurityStampAsync (userId) ใช้งานได้กับ UseOAuthBearerTokens หรือไม่
Rikard

7
ไม่ OAuthBearerTokens ไม่ได้รับผลกระทบในขณะนี้
Hao Kung

3
UseCookieAuthenticationจะเลิกตอนนี้ services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));ฉันจัดการการกำหนดค่าการใช้
riezebosch

11

UseCookieAuthentication เลิกใช้แล้วในตอนนี้ ฉันจัดการเพื่อกำหนดค่าโดยใช้

services.Configure<SecurityStampValidatorOptions>(o => 
    o.ValidationInterval = TimeSpan.FromSeconds(10));

ย้ายจากการตอบกลับคำตอบต่อการร้องขอ


3
สิ่งนี้ใช้งานได้หรือไม่หากฉันใช้ ASP.NET (ไม่ใช่ Core) ฉันสับสน. ถ้าฉันไปที่Asp Identity Repo มันบอกว่ามันเป็นของ Asp.NET Core
El Mac

5

ฉันสังเกตเห็นว่า SecurityStamp จำเป็นสำหรับการตรวจสอบโทเค็น

หากต้องการ repo: ตั้งค่า SecurityStamp เป็นโมฆะใน databsae สร้างโทเค็น (ทำงาน ok) ตรวจสอบโทเค็น (ล้มเหลว)


นั่นเป็นข้อผิดพลาด ไม่มีเหตุผลที่จะสร้างโทเค็นที่ไม่สามารถตรวจสอบได้
William T. Mallard

ข้อผิดพลาดคือมันช่วยให้คุณสร้างโทเค็นเมื่อตราประทับความปลอดภัยว่างเปล่า (imho GenerateEmailConfirmationToken ควรล้มเหลวหากไม่มีตราประทับความปลอดภัยดูคำตอบนี้: stackoverflow.com/a/29926407/1058214 )
mendel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.