คุณไม่จำเป็นต้องค้นหาฐานข้อมูลโดยตรงสำหรับ ApplicationUser ปัจจุบัน
ที่แนะนำการพึ่งพาใหม่ของการมีบริบทพิเศษสำหรับ starters แต่ไปข้างหน้าตารางฐานข้อมูลผู้ใช้เปลี่ยน (3 ครั้งใน 2 ปีที่ผ่านมา) แต่ API มีความสอดคล้อง ตัวอย่างเช่นusers
ตารางเรียกว่าตอนนี้AspNetUsers
ในเอกลักษณ์กรอบและชื่อของหลายสาขาคีย์หลักที่เก็บรักษาไว้ที่เปลี่ยนแปลงดังนั้นรหัสในหลายคำตอบจะไม่ทำงานตามที่เป็น
ปัญหาอีกประการหนึ่งคือการเข้าถึง OWIN พื้นฐานไปยังฐานข้อมูลจะใช้บริบทแยกต่างหากดังนั้นการเปลี่ยนแปลงจากการเข้าถึง SQL แยกต่างหากสามารถสร้างผลลัพธ์ที่ไม่ถูกต้อง (เช่นไม่เห็นการเปลี่ยนแปลงที่เกิดขึ้นกับฐานข้อมูล) อีกครั้งแก้ปัญหาคือการทำงานร่วมกับ API การจัดหาและไม่พยายามที่จะทำงานรอบมัน
วิธีที่ถูกต้องในการเข้าถึงวัตถุผู้ใช้ปัจจุบันใน ASP.Net identity (ณ วันที่นี้) คือ:
var user = UserManager.FindById(User.Identity.GetUserId());
หรือถ้าคุณมีการกระทำแบบอะซิงก์สิ่งที่ชอบ:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
ต้องการให้คุณมีคำสั่งการใช้ดังต่อไปนี้เพื่อให้วิธีการที่ไม่ใช่ async UserManager
พร้อมใช้งาน (เป็นวิธีส่วนขยายสำหรับ UserManager ดังนั้นหากคุณไม่รวมสิ่งนี้คุณจะเห็นเท่านั้นFindByIdAsync
):
using Microsoft.AspNet.Identity;
หากคุณไม่ได้อยู่ในคอนโทรลเลอร์เลย (เช่นคุณกำลังใช้การฉีด IOC) จากนั้นรหัสผู้ใช้จะถูกเรียกคืนจาก:
System.Web.HttpContext.Current.User.Identity.GetUserId();
หากคุณไม่ได้อยู่ในตัวควบคุมบัญชีมาตรฐานคุณจะต้องเพิ่มสิ่งต่อไปนี้ (เป็นตัวอย่าง) ในตัวควบคุมของคุณ:
1. เพิ่มคุณสมบัติทั้งสองนี้:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. เพิ่มสิ่งนี้ใน Constructor ของ Controller:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
อัปเดตมีนาคม 2558
หมายเหตุ: การอัพเดตเฟรมเวิร์ก Identity ล่าสุดจะเปลี่ยนหนึ่งในคลาสพื้นฐานที่ใช้สำหรับการตรวจสอบความถูกต้อง ตอนนี้คุณสามารถเข้าถึงได้จากบริบท Owin ของ HttpContent ปัจจุบัน
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
ภาคผนวก:
เมื่อใช้ EF และ Identity Framework กับ Azure ผ่านการเชื่อมต่อฐานข้อมูลระยะไกล (เช่นการทดสอบโฮสต์ท้องถิ่นกับฐานข้อมูล Azure) คุณสามารถสุ่มเลือกข้อผิดพลาด“ ข้อผิดพลาดที่น่ากลัว: 19 - การเชื่อมต่อทางกายภาพไม่สามารถใช้งานได้” เนื่องจากสาเหตุถูกฝังอยู่ภายใน Identity Framework ซึ่งคุณไม่สามารถเพิ่มการลองใหม่ (หรือสิ่งที่ดูเหมือนจะหายไป.Include(x->someTable)
) คุณจำเป็นต้องปรับใช้แบบกำหนดเองSqlAzureExecutionStrategy
ในโครงการของคุณ