2013-08-26 108 views
138
  • Tôi làm cách nào để có được id của người dùng hiện đang đăng nhập trong MVC 5? Tôi đã thử các đề xuất StackOverflow, nhưng chúng dường như không phải cho MVC 5.
  • Ngoài ra, MVC 5 thực hành tốt nhất việc gán nội dung cho người dùng là gì? (Ví dụ như một User nên có Items. Tôi có nên lưu trữ của Id trong Item tài khoản? Tôi có thể mở rộng các lớp User với một tài sản List<Item> chuyển hướng?

Tôi đang sử dụng "User Accounts cá nhân" từ mẫu MVC.Cách nhận người dùng hiện tại và cách sử dụng Lớp người dùng trong MVC5?

Cố gắng này:

'Membership.GetUser()' là null.

+0

Đã thêm tham chiếu về những gì tôi đã thử. Người cuối cùng đã được OK trong MVC4 nhưng không phải trong MVC5. Ngoài ra tôi cần một số thực hành tốt nhất về "sử dụng người dùng" :) –

+0

Khi bạn nói bạn đang sử dụng MVC 5, bạn đang sử dụng thành viên nào? OWin.Security? – Aron

+0

"Tài khoản người dùng cá nhân" từ mẫu MVC. –

Trả lời

278

Nếu bạn đang mã hóa trong một ASP.NET MVC Controller, sử dụng

using Microsoft.AspNet.Identity; 

... 

User.Identity.GetUserId(); 

Đáng nói rằng User.Identity.IsAuthenticatedUser.Identity.Name sẽ làm việc mà không cần thêm nêu trên using tuyên bố. Nhưng GetUserId() sẽ không có mặt mà không có nó.

Nếu bạn đang ở trong một lớp khác hơn là một điều khiển, sử dụng

HttpContext.Current.User.Identity.GetUserId(); 

Trong mẫu mặc định của MVC 5, ID người dùng là một GUID được lưu trữ như là một chuỗi.

Không thực hành tốt nhất được nêu ra, nhưng không tìm thấy một số thông tin có giá trị về mở rộng hồ sơ người dùng:

+8

Xác thực người dùng và ủy quyền đã thay đổi cho ASP.NET MVC 5. Bây giờ là xác thực dựa trên xác nhận quyền sở hữu với giao diện và kho chung mà bạn có thể sử dụng với EF hoặc nhà cung cấp khác (thực hiện EF là mặc định). Vì 'GetUserId' là một phương thức mở rộng được lưu trữ ở dưới cùng của' Ass_Start \ IdentityConfig.cs', bất cứ nơi nào bạn cần sử dụng nó, nếu trên một không gian tên khác, bạn sẽ phải đặt 'using Microsoft.AspNet.Identity' cho phần mở rộng để hiển thị. –

+1

survey.UserId = Guid.Parse (User.Identity.GetUserId()); – NicoJuicy

+0

Nếu tôi thêm người dùng tham chiếu thì vẫn được gạch chân đỏ? Tại sao điều này lại là? – Zapnologica

7

Lấy Id khá đơn giản và bạn đã giải quyết được điều đó.

Câu hỏi thứ hai của bạn mặc dù có liên quan nhiều hơn một chút.

Vì vậy, đây là tất cả các công cụ phát hành ngay bây giờ, nhưng vấn đề chung mà bạn đang gặp phải là nơi bạn đang mở rộng người dùng với các thuộc tính mới (hoặc bộ sưu tập Các mục trong câu hỏi).

Ngoài hộp, bạn sẽ nhận được tệp có tên IdentityModel trong thư mục Mô hình (tại thời điểm viết). Trong đó bạn có một vài lớp; ApplicationUserApplicationDbContext.Để thêm bộ sưu tập của bạn là Items, bạn sẽ muốn sửa đổi lớp ApplicationUser, giống như bạn nếu đây là lớp bình thường bạn đang sử dụng với Entity Framework. Trong thực tế, nếu bạn nhìn nhanh dưới mui xe, bạn sẽ thấy rằng tất cả các lớp liên quan đến danh tính (User, Role, ...) chỉ là POCO với chú thích dữ liệu thích hợp để chúng hoạt động tốt với EF6.

Tiếp theo, bạn sẽ cần thực hiện một số thay đổi đối với hàm tạo AccountController để nó biết sử dụng DbContext của bạn.

public AccountController() 
{ 
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext())); 
} 

Bây giờ, hãy nhận được toàn bộ đối tượng người dùng cho người dùng đã đăng nhập của bạn là một chút bí truyền thành thật.

var userWithItems = (ApplicationUser)await IdentityManager.Store.Users 
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None); 

Dòng đó sẽ hoàn thành công việc và bạn có thể truy cập userWithItems.Items như bạn muốn.

HTH

+0

Tôi không cho rằng có bất cứ điều gì giống như tài liệu tiền phát hành cho tất cả điều này là có? –

+0

@Derek Tomes - Không phải tôi đã gặp phải. Tôi nghĩ chúng tôi sẽ phải đợi đến ngày 13 tháng 11 để có tài liệu thực sự. Thật không hay khi nói thật, thậm chí còn có một yêu cầu hướng dẫn tốt hơn về việc sử dụng chúng tôi - http://aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/4148568-better-guidance-documentation-on -mvc-5 – Stimul8d

+0

ok nhưng làm thế nào để tôi nhận được một thể hiện kiểu 'AccountController'? – nest

0

Tôi cảm thấy đau đớn của bạn, tôi đang cố gắng làm điều tương tự. Trong trường hợp của tôi, tôi chỉ muốn xóa người dùng.

Tôi đã tạo một lớp bộ điều khiển cơ sở mà tất cả các trình điều khiển của tôi kế thừa từ đó. Trong đó tôi ghi đè OnAuthentication và thiết lập filterContext.HttpContext.User to null

Đó là tốt nhất mà tôi đã quản lý để xa ...

public abstract class ApplicationController : Controller 
{ 
    ... 
    protected override void OnAuthentication(AuthenticationContext filterContext) 
    { 
     base.OnAuthentication(filterContext); 

     if (...) 
     { 
      // You may find that modifying the 
      // filterContext.HttpContext.User 
      // here works as desired. 
      // In my case I just set it to null 
      filterContext.HttpContext.User = null; 
     } 
    } 
    ... 
} 
26

Hãy thử một cái gì đó như:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
var userManager = new UserManager<ApplicationUser>(store); 
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result; 

trình với RTM.

+11

Nó áp đặt chuyến đi cơ sở dữ liệu không cần thiết. – Arash

+2

@Arash, ứng dụng phải nhận đối tượng của người dùng mà không cần liên hệ với cơ sở dữ liệu như thế nào? – fabspro

+2

@Arash đừng bận tâm, tôi hiểu ý của bạn là gì. ID có thể được truy xuất với User.Identity.GetUserId(); không có bất kỳ chuyến đi cơ sở dữ liệu nào. – fabspro

14

Nếu bạn muốn đối tượng ApplicationUser trong một dòng mã (nếu bạn có Identity ASP.NET mới nhất được cài đặt), hãy thử:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

Bạn sẽ cần những điều khoản sử dụng sau đây:

using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin;