Làm thế nào để có được người dùng hiện tại trong ASP.NET MVC


268

Trong mô hình biểu mẫu, tôi đã sử dụng để có được người dùng đăng nhập hiện tại bằng cách:

Page.CurrentUser

Làm cách nào để có được người dùng hiện tại bên trong một lớp trình điều khiển trong ASP.NET MVC?

Câu trả lời:


266

Nếu bạn cần lấy người dùng từ bên trong bộ điều khiển, hãy sử dụng thuộc Usertính của Bộ điều khiển. Nếu bạn cần nó từ chế độ xem, tôi sẽ điền vào những gì bạn đặc biệt cần trong ViewDatahoặc bạn chỉ có thể gọi Người dùng vì tôi nghĩ đó là tài sản của ViewPage.


2
"Hoặc bạn chỉ có thể gọi Người dùng vì tôi nghĩ đó là tài sản của ViewPage" - Vậy bạn có nghĩa là sử dụng Page.user khi bạn ở trong chế độ xem?
mawaldne

17
Có, bạn có thể sử dụng nó như "Xin chào, @ User.Identity.Name!" trong cshtml.
Sean

198

Tôi thấy rằng Userhoạt động, đó là, User.Identity.Namehoặc User.IsInRole("Administrator").


19
Chỉ cần thêm vào điều này, nếu bạn đang làm việc trong một lớp bên ngoài một biểu mẫu, bạn sẽ cần Imports System.Webvà đủ điều kiện hơn với HttpContext.Current.User.Identity.Name, hoặc trực tiếp đủ điều kiện bằng cách sử dụng cú pháp đầy đủ:System.Web.HttpContext.Current.User.Identity.Name
Paul

Hoạt động bên trong Bộ điều khiển và nếu sử dụng ViewModel, kế thừa từ Bộ điều khiển hoặc làm theo đề xuất của Paul.
hữu íchBee

60

Hãy thử HttpContext.Current.User.

Tài sản được chia sẻ công khai hiện tại () Là System.Web.HttpContext
Thành viên của System.Web.HttpContext

Tóm tắt:
Nhận hoặc đặt đối tượng System.Web.HttpContext cho yêu cầu HTTP hiện tại.

Giá trị trả về:
System.Web.HttpContext cho yêu cầu HTTP hiện tại


2
Rõ ràng là HTTPContext không có thuộc tính có tên là "Hiện tại".
Serhat Ozgel

20
Tôi tin rằng hai bạn đang nói về hai điều khác nhau. System.Web.HttpContext và thuộc tính tĩnh: System.Web.Mvc.Controll.HttpContext (Không có thuộc tính "Hiện tại".
Jeff Sheldon

1
Điều đó làm việc trên một môi trường không phải là MVC, đúng như những gì tôi cần. Cảm ơn! :)
Wagner da Silva

38

Bạn có thể lấy tên của người dùng trong ASP.NET MVC4 như thế này:

System.Web.HttpContext.Current.User.Identity.Name

4
Nếu bạn gặp lỗi này 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found, tôi khuyên bạn nên thực hiện một cuộc gọi tuyệt đối như thế này System.Web.HttpContext.Current.User.Identity.Name.
Sandman đơn giản ngày

21

Tôi nhận ra điều này thực sự cũ, nhưng tôi mới bắt đầu với ASP.NET MVC, vì vậy tôi nghĩ rằng tôi đã gắn hai xu của mình vào:

  • Request.IsAuthenticated cho bạn biết nếu người dùng được xác thực.
  • Page.User.Identity cung cấp cho bạn danh tính của người dùng đã đăng nhập.

16

Tôi sử dụng:

Membership.GetUser().UserName

Tôi không chắc điều này sẽ hoạt động trong ASP.NET MVC, nhưng nó đáng để thử :)


Lớp thành viên này đến từ đâu? IntelliSense không nhận ra nó theo mặc định.
Serhat Ozgel

Không gian tên System.Web.Security. Tôi không tích cực, điều này hữu ích trong MVC nhưng tôi sử dụng nó với các điều khiển đăng nhập cho Web Forms.
Sean

1
Nó hữu ích trong mọi ứng dụng ASP.NET sử dụng các nhà cung cấp Thành viên.
jamiebarrow

2
Điều này thực sự sẽ làm cho một yêu cầu cơ sở dữ liệu. HttpContext.Cản.User không.
Mike Cole

11

đăng nhập tên người dùng: System.Web.HttpContext.Current.User.Identity.Name


9

Để tham chiếu ID người dùng được tạo bằng xác thực đơn giản được tích hợp trong ASP.NET MVC 4 trong bộ điều khiển cho mục đích lọc (rất hữu ích nếu bạn đang sử dụng cơ sở dữ liệu trước và Entity Framework 5 để tạo các liên kết đầu tiên mã và các bảng của bạn được cấu trúc như vậy rằng một khóa ngoại cho userID được sử dụng), bạn có thể sử dụng

WebSecurity.CurrentUserId

một khi bạn thêm một câu lệnh sử dụng

using System.Web.Security;

4
Thật không may, điều này dường như không còn hoạt động nữa trong MVC 5. Không chắc tại sao = /
Jed Grant

2
Chỉ System.Security.Principal.WindowsIdentity.GetCurrent().Namehoạt động trong MVC 5. Tuy nhiên, điều đó kéo lên tên miền với tên người dùng. tức là tên miền \ tên người dùng
shaz

8

Chúng tôi có thể sử dụng mã sau đây để có được Người dùng đã đăng nhập hiện tại trong ASP.Net MVC:

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

Cũng thế

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'

7

Tên người dùng với:

User.Identity.Name

Nhưng nếu bạn chỉ cần lấy ID, bạn có thể sử dụng:

using Microsoft.AspNet.Identity;

Vì vậy, bạn có thể lấy trực tiếp ID người dùng:

User.Identity.GetUserId();

Phương thức này trả về một System.Guid
Gilberto B. Terra Jr.

User.Identity.Name là một thể hiện của System.Security.Principal.IPrincipal mà không có một tài sản id ... Đây có phải là tài khoản khác với tài khoản đối tượng User.Identity.GetUserId 's
Samra


5

Sử dụng System.Security.Principal.WindowsIdentity.GetCurrent().Name.

Điều này sẽ có được người dùng Windows đăng nhập hiện tại.


1
Mặc dù mã này có thể trả lời câu hỏi, nhưng sẽ tốt hơn nếu bao gồm một số bối cảnh, giải thích cách thức hoạt động và mô tả khi nào nên sử dụng nó. Câu trả lời chỉ có mã là không hữu ích trong thời gian dài.
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCản (). Tên trả về người dùng hiện tại đã đăng nhập vào Windows, OP đang yêu cầu người dùng hiện đang đăng nhập vào trang web.
GrandMasterFlush

4

Để biết giá trị của nó, trong ASP.NET MVC 3, bạn chỉ có thể sử dụng Người dùng trả về người dùng cho yêu cầu hiện tại.


4

Nếu bạn đang ở trong trang đăng nhập của mình, ví dụ như trong sự kiện LoginUser_LoggedIn, Current.User.Identity.Name sẽ trả về một giá trị trống, do đó bạn phải sử dụng thuộc tínhLoginControlName.UserName của bạn.

MembershipUser u = Membership.GetUser(LoginUser.UserName);

4

Bạn có thể sử dụng mã sau đây:

Request.LogonUserIdentity.Name;

Điều này giúp bạn có tên người dùng của AppPool mà ứng dụng đang chạy.
Jason Geiger

3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");

2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));

2

Nếu bạn tình cờ làm việc trong Active Directory trên mạng nội bộ, đây là một số mẹo:

(Máy chủ Windows 2012)

Chạy bất cứ điều gì nói chuyện với AD trên máy chủ web đòi hỏi một loạt các thay đổi và kiên nhẫn. Vì khi chạy trên máy chủ web so với IIS / IIS Express cục bộ, nó chạy trong danh tính của AppPool, do đó, bạn phải thiết lập nó để mạo danh bất kỳ ai truy cập trang web.

Cách nhận người dùng đăng nhập hiện tại trong một thư mục hoạt động khi ứng dụng ASP.NET MVC của bạn đang chạy trên máy chủ web trong mạng:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

Bạn phải bọc mọi cuộc gọi phải thực hiện với 'bối cảnh thư mục hoạt động' trong phần sau để nó hoạt động như môi trường lưu trữ để lấy thông tin quảng cáo:

using (HostingEnvironment.Impersonate()){ ... }

Bạn cũng phải impersonateđặt thành true trong web.config:

<system.web>
    <identity impersonate="true" />

Bạn phải có xác thực Windows trên web.config:

<authentication mode="Windows" />

Tôi không tin như vậy, vì điều này rõ ràng là sử dụng thông tin đăng nhập người dùng Active Directory của bạn. Tại sao bạn có 'Biểu mẫu' nếu bạn muốn người dùng của mình được xác thực qua AD?
Beau D'Amore

Trong tổ chức của chúng tôi, có những địa điểm nơi chúng tôi có một vài máy trạm được chia sẻ bởi một số nhân viên "lĩnh vực". Do đó, chúng tôi được yêu cầu thêm trang đăng nhập vào các ứng dụng web mạng nội bộ của chúng tôi.
Patee Gutee

như một giải pháp thay thế: bạn có thể có hai bản sao của ứng dụng này đang chạy, một trong chế độ 'Biểu mẫu' với các bảng nhận dạng của riêng nó hoặc bạn có thể kết hợp cả hai trong một ứng dụng, nhưng nó khó hơn. Một google nhanh chóng tiết lộ điều này: stackoverflow.com/questions/2250921/ từ
Beau D'Amore

<nhận dạng impersonate = "true" /> có thể cần thay đổi nếu trộn
Beau D'Amore

2

Trong Asp.net Mvc Identity 2, Bạn có thể lấy tên người dùng hiện tại bằng cách:

var username = System.Web.HttpContext.Current.User.Identity.Name;

1

Trong Trình quản lý IIS, bên dưới Xác thực, tắt: 1) Xác thực ẩn danh 2) Xác thực mẫu

Sau đó thêm phần sau vào bộ điều khiển của bạn, để xử lý kiểm tra so với triển khai máy chủ:

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
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.