2014-12-29 24 views
13

MVC 5 với danh tính asp.net 2.0Lấy id người dùng của nhận dạng tên người dùng 2.0

Tôi hiểu cách nhận id người dùng hiện đã đăng nhập. Tôi có một nhu cầu để có được id người dùng của một người dùng khác nhau trong hệ thống. Làm thế nào được thực hiện?

Ví dụ: Tôi cần lấy id người dùng của tên người dùng "fsmith" ...

+0

Đối với vấn đề này, tôi thực sự trong một bộ điều khiển khác - không phải là bộ điều khiển tài khoản. Làm thế nào để bạn có được bối cảnh quản lý người dùng từ một bộ điều khiển khác? –

Trả lời

21

Bên trong danh từ tController bạn có thể gọi phương thức sau để lấy đối tượng người dùng và sau đó lấy Id người dùng.

var user = await UserManager.FindByNameAsync(userName); 
var userId = user.Id; 

Nếu bạn không phải là bên AccountController bạn có thể lấy tài liệu tham khảo UserManager sử dụng đoạn mã sau

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
+0

Ok - tiến gần hơn. Tôi có tham chiếu người quản lý người dùng.Bây giờ tôi nhận được một lỗi trong IDE nói một cái gì đó về chờ đợi cần một phương pháp async, vv –

+1

Bạn chỉ có thể gọi phương thức đồng bộ như sau 'var user = UserManager.FindByName (userName);' Cách khác, bạn có thể làm cho Controller của bạn hoạt động một phương thức Async bằng cách sử dụng convetion sau đây. 'công khai async tác vụ YourControllerAction (...)' Kiểm tra về async đang chờ sử dụng. –

+0

Không hoạt động không đồng bộ! –

1

Một cách để sử dụng phương thức FindByNameAsync của người quản lý người dùng của bạn (hoặc phiên bản chung của nó). Nó lấy tên của người dùng (trong trường hợp của bạn là "fsmith") và trả về một nhiệm vụ của một đối tượng người dùng. Đối tượng người dùng này chứa tất cả thông tin có sẵn về người dùng đó.

Một đoạn mã có thể trông giống như một sau (nếu bạn đang tìm kiếm ID cơ sở dữ liệu):

var user = await UserManager.FindByNameAsync("fsmith"); 
var userId = user.Id; 

EDIT

Các dụ UserManager thường được khai báo như sau (giữ lưu ý rằng có nhiều cách tuyên bố nó, ví dụ: khi sử dụng Dependency Injection):

public AccountController() 
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))) 
{ 
} 

public AccountController(UserManager<ApplicationUser> userManager) 
{ 
    UserManager = userManager; 
} 

public UserManager<ApplicationUser> UserManager { get; private set; } 
+0

Làm thế nào để bạn có được ngữ cảnh "quản lý người dùng"? –

+0

Xem chỉnh sửa trong bài đăng của tôi. Khi sử dụng mẫu Visual Studio bạn sẽ tìm thấy khai báo bên trong ** AccountController ** của bạn. –

3

Để thêm vào câu trả lời hữu ích Shashi của ...

Nếu bạn đang ở trong tài khoản bộ điều khiển bạn có thể sử dụng UserManager hiện tại:

var user = await UserManager.FindByNameAsync(userName); 
var userId = user.Id; 

Trong bộ điều khiển khác s (và có thể chọn những nơi khác, nơi HttpContext có sẵn), bạn tạo ra một quản lý người dùng với:

var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

Nhưng những gì nó đã cho tôi một thời gian để nhận ra là bạn có thể nhận được vào nó chỉ là về bất cứ nơi nào với bit cuối cùng này. Ví dụ tôi đã sử dụng nó trong phương thức hạt giống của tôi (trong Configuration.cs) vì vậy tôi có thể gieo rắc các tài sản tài của mô hình khác:

var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(*insert-your-db-context-here*)); 
+0

Đây là câu trả lời chính xác hơn. –

0

Nếu bạn đang sử dụng vòng bi Mã Auth, ví dụ trên không trả về một ứng dụng tài khoản .

Thay vào đó, sử dụng này:

ClaimsPrincipal currentUser = this.User; 
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; 
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName); 
return user.Id; 

này hoạt động trong apsnetcore 2.0. Đã không cố gắng trong các phiên bản trước đó.

Các vấn đề liên quan