Bạn không cần phải truy vấn cơ sở dữ liệu trực tiếp cho ApplicationUser hiện tại.
Điều đó giới thiệu một sự phụ thuộc mới của việc có một bối cảnh bổ sung cho người mới bắt đầu, nhưng về phía trước các bảng cơ sở dữ liệu người dùng sẽ thay đổi (3 lần trong 2 năm qua) nhưng API là nhất quán. Ví dụ, users
bảng hiện được gọi AspNetUsers
trong Khung nhận dạng và tên của một số trường khóa chính liên tục thay đổi, do đó, mã trong một số câu trả lời sẽ không còn hoạt động như hiện tại .
Một vấn đề khác là quyền truy cập OWIN cơ sở vào cơ sở dữ liệu sẽ sử dụng một ngữ cảnh riêng, do đó những thay đổi từ quyền truy cập SQL riêng biệt có thể tạo ra kết quả không hợp lệ (ví dụ: không thấy các thay đổi được thực hiện cho cơ sở dữ liệu). Một lần nữa, giải pháp là làm việc với API được cung cấp và không cố gắng làm việc xung quanh nó.
Cách chính xác để truy cập đối tượng người dùng hiện tại trong danh tính ASP.Net (tại thời điểm này) là:
var user = UserManager.FindById(User.Identity.GetUserId());
hoặc, nếu bạn có một hành động không đồng bộ, đại loại như:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
yêu cầu bạn phải sử dụng câu lệnh sau để UserManager
có sẵn các phương thức không đồng bộ (chúng là các phương thức mở rộng cho UserManager, vì vậy nếu bạn không bao gồm điều này, bạn sẽ chỉ thấy FindByIdAsync
):
using Microsoft.AspNet.Identity;
Nếu bạn hoàn toàn không ở trong bộ điều khiển (ví dụ: bạn đang sử dụng IOC tiêm), thì id người dùng được truy xuất đầy đủ từ:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Nếu bạn không ở trong bộ điều khiển Tài khoản tiêu chuẩn, bạn sẽ cần thêm các mục sau (ví dụ) vào bộ điều khiển của mình:
1. Thêm hai thuộc tính này:
/// <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. Thêm phần này vào hàm tạo của Trình điều khiển:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Cập nhật tháng 3 năm 2015
Lưu ý: Bản cập nhật gần đây nhất cho khung Nhận dạng thay đổi một trong các lớp cơ bản được sử dụng để xác thực. Bây giờ bạn có thể truy cập nó từ Bối cảnh Owin của HttpContent hiện tại.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Phụ lục:
Khi sử dụng EF và Khung nhận dạng với Azure, qua kết nối cơ sở dữ liệu từ xa (ví dụ: kiểm tra máy chủ cục bộ vào cơ sở dữ liệu Azure), bạn có thể ngẫu nhiên gặp phải lỗi Lỗi đáng sợ: 19 - Kết nối vật lý không thể sử dụng được. Vì nguyên nhân được chôn giấu bên trong Khung nhận dạng, nơi bạn không thể thêm lần thử lại (hoặc có vẻ như bị thiếu .Include(x->someTable)
), bạn cần thực hiện một tùy chỉnh SqlAzureExecutionStrategy
trong dự án của mình.