Làm cách nào để có được người dùng hiện tại và cách sử dụng lớp Người dùng trong MVC5?


159
  • Làm cách nào tôi có thể lấy 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 dường như chúng không dành cho MVC 5.
  • Ngoài ra, MVC 5 thực hành tốt nhất để gán công cụ cho người dùng là gì? (ví dụ như một Usernên có Items. Nên tôi lưu trữ của người dùng Idtrong Item? Can I mở rộng Userlớp học với một List<Item>tài sản chuyển hướng?

Tôi đang sử dụng "Tài khoản người dùng cá nhân" từ mẫu MVC.

Đã thử những điều này:

'Tư cách thành viên.GetUser ()' là null.


Đã thêm các tài liệu tham khảo về những gì tôi đã thử. Cái cuối cùng là 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" :)
Adam Szabo

Khi bạn nói rằng bạn đang sử dụng MVC 5, bạn đang sử dụng gì để trở thành thành viên? SỞ HỮU?
Aron

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

3
HttpContext.Current.User.Identity.Namelà tên của người dùng hiện đang đăng nhập.
Wiktor Zychla

1
Làm thế nào để có được Id ? Tôi muốn chỉ định người dùng hiện tại cho người dùng Itemmà anh ta tạo, nhưng không dựa trên tên người dùng (điều đó có thể thay đổi). Nó không hoạt động theo cách `httpContext.Cản 'System.Web.HttpContextBase' không chứa định nghĩa cho 'Hiện tại' và không có phương thức mở rộng 'Hiện tại' chấp nhận đối số đầu tiên của loại 'System.Web.HttpContextBase' có thể được tìm thấy ( bạn đang thiếu một lệnh sử dụng hoặc tham chiếu lắp ráp?) `. Bạn có chắc rằng giải pháp của bạn là dành cho MVC 5?
Adam Szabo

Câu trả lời:


313

Nếu bạn đang mã hóa trong Trình điều khiển ASP.NET MVC, hãy sử dụng

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Đáng nói đến điều đó User.Identity.IsAuthenticatedUser.Identity.Namesẽ làm việc mà không cần thêm các usingtuyên bố đã đề cập ở trên . Nhưng GetUserId()sẽ không có mặt mà không có nó.

Nếu bạn ở trong một lớp không phải là Trình điều khiển, hãy sử dụng

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

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

Không có thực tiễn tốt nhất nào, nhưng tìm thấy một số thông tin có giá trị về việc mở rộng hồ sơ người dùng:


9
Xác thực và ủy quyền người dùng đã thay đổi cho ASP.NET MVC 5. Bây giờ, đó là xác thực dựa trên Yêu cầu với các giao diện và kho lưu trữ chung mà bạn có thể sử dụng với EF hoặc nhà cung cấp khác (triển khai EF là mặc định). Vì GetUserIdlà một phương thức mở rộng được lưu trữ ở dưới cùng 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.Identitytiện ích mở rộng để hiển thị.
Anderson Matos

1
khảo sát.UserId = Guid.Pude (User.Identity.GetUserId ());
NicoJuicy

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

@Zapnologica: hãy thử xây dựng lại dự án, có thể VS IntelliSense hơi chậm.
Adam Szabo

5
LƯU Ý tài khoản chỉ có sẵn trong một điều khiển msdn.microsoft.com/en-us/library/... (@Zapnologica bạn đang sử dụng nó bên ngoài của một bộ điều khiển thử HttpContext.Current.User.Identity.GetUserId ();?)
Adween

28

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;

Hoạt động với RTM.


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

3
@Arash, làm thế nào để ứng dụng có được đối tượng người dùng mà không liên hệ với cơ sở dữ liệu?
fabspro

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

Ghi nhớ với mvc5 (thành viên 2): User.Identity.GetUserId () khác với id trong bảng [AspNetUsers]. Vì vậy, Jakub Arnold và Rok là cách chính xác
Sói xám

Tôi hơi bối rối với câu trả lời. Tôi nhận được loại UserStore dường như không tồn tại trong ngữ cảnh bộ điều khiển của tôi. Có ý kiến ​​gì không?
Jhourlad Estrella

19

Nếu bạn muốn đối tượng ApplicationUser trong một dòng mã (nếu bạn đã cài đặt Nhận dạng ASP.NET mới nhấ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 các câu lệnh sử dụng sau:

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

Không tìm thấy đối tượng cho <ApplicationUserManager>
Fandango68

7

Nhận Id khá dễ dàng và bạn đã giải quyết đ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 trước ngay bây giờ, nhưng vấn đề phổ biến bạn gặp phải là việc bạn mở rộng người dùng với các thuộc tính mới (hoặc bộ sưu tập Vật phẩm trong câu hỏi của bạn).

Ra khỏi hộp bạn sẽ nhận được một tệp được gọi IdentityModeltrong thư mục Mô hình (tại thời điểm viết). Trong đó bạn có một vài lớp học; ApplicationUserApplicationDbContext. Để thêm bộ sưu tập Itemsbạn sẽ muốn sửa đổi ApplicationUserlớp, giống như bạn sẽ làm nếu đây là một lớp bình thường bạn đang sử dụng với Entity Framework. Trên thực tế, nếu bạn xem nhanh phần dưới, bạn sẽ thấy rằng tất cả các lớp liên quan đến danh tính (Người dùng, Vai trò, v.v.) bây giờ chỉ là các POCO với các chú thích dữ liệu phù hợp để chúng chơi 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 AccountControllertạo để nó biết sử dụng DbContext của bạn.

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

Bây giờ, việc lấy 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í mật để 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 sẽ có thể truy cập userWithItems.Itemsnhư bạn muốn.

HTH


Tôi không cho rằng có bất cứ thứ gì như tài liệu tiền phát hành cho tất cả những thứ này không?
Derek Tomes

@Derek Tomes - Không phải là tôi đã đi qua. Tôi nghĩ chúng ta sẽ phải đợi đến ngày 13 tháng 11 để có tài liệu thực sự. Thành thật mà nói, thật không hay, thậm chí còn có yêu cầu hướng dẫn tốt hơn tại uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/,
EightyOne Unite

ok nhưng làm thế nào để tôi có được một thể loại AccountController?
tổ

0

Tôi cảm thấy nỗi đau 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 trình đ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 đè OnAuthenticationvà đặtfilterContext.HttpContext.User to null

Đó là điều tốt nhất tôi từng quản lý cho đến nay ...

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;
        }
    }
    ...
}

0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

Xin vui lòng không chỉ đăng mã đặc biệt không phải không có bất kỳ ý kiến. Nếu bạn giải thích mã của bạn, nó sẽ hữu ích hơn.
Ali Kanat

0

nếu có ai khác gặp phải tình huống này: tôi đang tạo một xác minh email để đăng nhập vào ứng dụng của mình để người dùng của tôi chưa đăng nhập, tuy nhiên tôi đã sử dụng cách dưới đây để kiểm tra email được nhập vào đăng nhập, đó là một biến thể của giải pháp @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

bạn cũng sẽ cần những điều sau đây:

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.Owin;

0

Trong .Net MVC5 core 2.2, tôi sử dụng HttpContext.User.Identity.Name. Nó làm việc cho tôi.


0

Đây là cách tôi có Id AspNetUser và hiển thị nó trên trang chủ của tôi

Tôi đã đặt đoạn mã sau trong phương thức HomeControll Index ()

ViewBag.userId = User.Identity.GetUserId();

Trong trang xem chỉ cần gọi

ViewBag.userId 

Chạy dự án và bạn sẽ có thể thấy userId của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.