วิธีรับผู้ใช้ปัจจุบันใน ASP.NET MVC


268

ในแบบฟอร์มฉันใช้เพื่อรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันโดย:

Page.CurrentUser

ฉันจะรับผู้ใช้ปัจจุบันภายในคลาสคอนโทรลเลอร์ใน ASP.NET MVC ได้อย่างไร

คำตอบ:


266

หากคุณต้องการพาผู้ใช้จากภายในคอนโทรลเลอร์ให้ใช้Userคุณสมบัติของคอนโทรลเลอร์ หากคุณจำเป็นต้องใช้มันจากมุมมองของผมจะเติมสิ่งที่คุณต้องการโดยเฉพาะในหรือคุณก็สามารถโทรหาผู้ใช้ตามที่ผมคิดว่ามันเป็นทรัพย์สินของViewDataViewPage


2
"หรือคุณอาจเรียกผู้ใช้อย่างที่ฉันคิดว่าเป็นคุณสมบัติของ ViewPage" - คุณหมายถึงใช้ Page.user เมื่อคุณอยู่ในมุมมองหรือไม่
mawaldne

17
ใช่คุณสามารถใช้มันได้เช่น "สวัสดี @ User.Identity.Name!" ใน cshtml
ฌอน

198

ฉันพบว่าUserการทำงานที่เป็นหรือUser.Identity.NameUser.IsInRole("Administrator")


19
เพียงเพื่อเพิ่มนี้ถ้าคุณกำลังทำงานในนอกชั้นเรียนของรูปแบบที่คุณจะต้องอย่างใดอย่างหนึ่งImports System.Webและยังมีคุณสมบัติที่มีด้วยHttpContext.Current.User.Identity.Nameหรือโดยตรงมีสิทธิ์ใช้ไวยากรณ์เต็ม:System.Web.HttpContext.Current.User.Identity.Name
พอล

ทำงานภายในคอนโทรลเลอร์และหากใช้ ViewModel อาจสืบทอดจากคอนโทรลเลอร์หรือทำตามคำแนะนำของ Paul
UsefulBee

60

ลองHttpContext.Current.Userดู

ทรัพย์สินสาธารณะที่ใช้ร่วมกันในปัจจุบัน () เป็น System.Web.HttpContext
สมาชิกของ System.Web.HttpContext

สรุป:
ได้รับหรือการตั้งค่าวัตถุ System.Web.HttpContext สำหรับการร้องขอ HTTP ปัจจุบัน

Return Values:
The System.Web.HttpContext สำหรับคำขอ HTTP ปัจจุบัน


2
เห็นได้ชัดว่า HttpContext ไม่มีคุณสมบัติชื่อ "ปัจจุบัน"
Serhat Ozgel

20
ฉันเชื่อว่าคุณสองคนกำลังพูดถึงสองสิ่งที่แตกต่างกัน System.Web.HttpContext และคุณสมบัติคงที่: System.Web.Mvc.Controller.HttpContext (ซึ่งไม่ได้มีคุณสมบัติ "ปัจจุบัน"
Jeff Sheldon

1
ที่ทำงานบนสภาพแวดล้อมที่ไม่ใช่ MVC สิ่งที่ฉันต้องการ ขอบคุณ! :)
Wagner da Silva

38

คุณสามารถรับชื่อผู้ใช้ใน ASP.NET MVC4 ดังนี้

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

4
หากคุณได้รับข้อผิดพลาดนี้ผมจะแนะนำให้โทรแน่นอนเช่นนี้'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 System.Web.HttpContext.Current.User.Identity.Name
Sandman แบบง่าย

21

ฉันรู้ว่านี่เก่ามาก แต่ฉันเพิ่งเริ่มต้นกับ ASP.NET MVC ดังนั้นฉันคิดว่าฉันติดสองเซ็นต์ของฉันใน:

  • Request.IsAuthenticated บอกคุณว่าผู้ใช้รับรองความถูกต้องหรือไม่
  • Page.User.Identity ให้ข้อมูลประจำตัวของผู้ใช้ที่เข้าสู่ระบบ

16

ฉันใช้:

Membership.GetUser().UserName

ฉันไม่แน่ใจว่าสิ่งนี้จะทำงานใน ASP.NET MVC แต่คุ้มค่ากับการถ่ายภาพ :)


ชั้นสมาชิกนี้มาจากไหน IntelliSense ไม่รู้จักโดยค่าเริ่มต้น
Serhat Ozgel

The System.Web.Security namespace ฉันไม่แน่ใจว่าสิ่งนี้มีประโยชน์ใน MVC แต่ฉันใช้กับการควบคุมการเข้าสู่ระบบสำหรับเว็บฟอร์ม
ฌอน

1
มีประโยชน์ในแอปพลิเคชัน ASP.NET ใด ๆ ที่ใช้ผู้ให้บริการสมาชิก
jamiebarrow

2
สิ่งนี้จะทำการร้องขอฐานข้อมูล HttpContext.Current.User ไม่
Mike Cole


9

เพื่ออ้างอิง ID ผู้ใช้ที่สร้างขึ้นโดยใช้การรับรองความถูกต้องแบบง่ายที่มีอยู่ใน ASP.NET MVC 4 ในคอนโทรลเลอร์เพื่อวัตถุประสงค์ในการกรอง (ซึ่งมีประโยชน์หากคุณใช้ฐานข้อมูลก่อนและ Entity Framework 5 เพื่อสร้างการผูกรหัสแรกและตารางของคุณ ว่าจะใช้รหัสต่างประเทศกับ ID ผู้ใช้) คุณสามารถใช้

WebSecurity.CurrentUserId

เมื่อคุณเพิ่มคำสั่งที่ใช้

using System.Web.Security;

4
น่าเสียดายที่นี่ดูเหมือนจะไม่ทำงานอีกต่อไปใน MVC 5 ไม่แน่ใจว่าทำไม = /
Jed Grant

2
เพียง แต่การทำงานในSystem.Security.Principal.WindowsIdentity.GetCurrent().Name MVC 5อย่างไรก็ตามที่ดึงชื่อโดเมนด้วยชื่อผู้ใช้ ie domain \ ชื่อผู้ใช้
shaz

8

เราสามารถใช้รหัสต่อไปนี้เพื่อรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันใน ASP.Net MVC:

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

ด้วย

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

Environment.UserName - Will Display format : 'Username'

7

ชื่อผู้ใช้ด้วย:

User.Identity.Name

แต่ถ้าคุณต้องการรับ ID คุณสามารถใช้:

using Microsoft.AspNet.Identity;

ดังนั้นคุณจะได้รับ ID ผู้ใช้โดยตรง:

User.Identity.GetUserId();

วิธีนี้จะคืนค่าSystem.Guid
Gilberto B. Terra Jr.

User.Identity.Name เป็นตัวอย่างของ System.Security.Principal.IPrincipal ซึ่งไม่มีคุณสมบัติ id ... ผู้ใช้รายนี้แตกต่างจาก User.Identity.GetUserId วัตถุผู้ใช้
Samra

6

หน้านี้อาจเป็นสิ่งที่คุณกำลังมองหา:
การใช้ Page.User.Identity.Name ใน MVC3

User.Identity.Nameคุณเพียงแค่ต้อง


ใช้งานได้เฉพาะภายในคอนโทรลเลอร์เท่านั้น หรือถ้า ViewModel ของคุณสืบทอดมาจาก Controller
ประโยชน์ Bee

5

System.Security.Principal.WindowsIdentity.GetCurrent().Nameใช้

สิ่งนี้จะได้รับผู้ใช้ Windows ปัจจุบัน


1
ในขณะที่รหัสนี้อาจตอบคำถามมันจะดีกว่าที่จะรวมบริบทอธิบายวิธีการทำงานและอธิบายเมื่อใช้ คำตอบแบบรหัสเท่านั้นไม่มีประโยชน์ในระยะยาว
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent () ชื่อส่งคืนผู้ใช้ปัจจุบันที่ล็อกอินเข้าสู่ Windows OP จะขอผู้ใช้ที่ล็อกอินเข้าสู่เว็บไซต์ในปัจจุบัน
GrandMasterFlush

4

สำหรับสิ่งที่คุ้มค่าใน ASP.NET MVC 3 คุณสามารถใช้ผู้ใช้ซึ่งส่งคืนผู้ใช้สำหรับคำขอปัจจุบัน


4

หากคุณอยู่ในหน้าเข้าสู่ระบบของคุณในเหตุการณ์ LoginUser_LoggedIn เช่น Current.User.Identity.Name จะส่งคืนค่าว่างดังนั้นคุณต้องใช้คุณสมบัติ LogLogControlName.UserName ของคุณ

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

4

คุณสามารถใช้รหัสต่อไปนี้:

Request.LogonUserIdentity.Name;

นี่ทำให้คุณชื่อผู้ใช้ของ AppPool ที่แอปพลิเคชันทำงานอยู่
Jason Geiger


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

หากคุณกำลังทำงานใน Active Directory บนอินทราเน็ตนี่คือเคล็ดลับบางประการ:

(Windows Server 2012)

การเรียกใช้สิ่งใดก็ตามที่พูดคุยกับ AD บนเว็บเซิร์ฟเวอร์ต้องมีการเปลี่ยนแปลงและความอดทน ตั้งแต่เมื่อทำงานบนเว็บเซิร์ฟเวอร์เทียบกับ IIS / IIS Express ในท้องถิ่นมันทำงานในข้อมูลประจำตัวของ AppPool ดังนั้นคุณต้องตั้งค่าเพื่อปลอมตัวเป็นใครก็ตามที่เข้าชมไซต์

วิธีรับผู้ใช้เข้าสู่ระบบปัจจุบันในไดเรกทอรีที่ใช้งานอยู่เมื่อแอปพลิเคชัน ASP.NET MVC ของคุณทำงานบนเว็บเซิร์ฟเวอร์ภายในเครือข่าย:

// 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...

คุณต้องปิดการโทรใด ๆ ที่เกี่ยวข้องกับ 'active directory context' ในรายการต่อไปนี้เพื่อทำหน้าที่เป็นสภาพแวดล้อมการโฮสต์เพื่อรับข้อมูลโฆษณา:

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

คุณต้องimpersonateตั้งค่าเป็นจริงใน web.config ของคุณ:

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

คุณต้องมีการตรวจสอบ Windows ใน web.config:

<authentication mode="Windows" />

ฉันไม่เชื่อเช่นนั้นเนื่องจากนี่เป็นการใช้ข้อมูลรับรองผู้ใช้ Active Directory ของคุณอย่างชัดเจน ทำไมคุณถึงมี 'แบบฟอร์ม' ถ้าคุณต้องการให้ผู้ใช้ของคุณได้รับการรับรองความถูกต้องผ่านทางโฆษณา
Beau D'Amore

ในองค์กรของเรามีสถานที่ซึ่งเรามีเวิร์คสเตชั่สองแห่งที่แบ่งใช้โดยบุคลากร "ฟิลด์" หลายคน ด้วยเหตุนี้เราจึงจำเป็นต้องเพิ่มหน้าเข้าสู่ระบบไปยังเว็บแอปพลิเคชันอินทราเน็ตของเรา
Patee Gutee

วิธีแก้ปัญหา: คุณสามารถมีแอพสองชุดนี้ทำงานอยู่หนึ่งชุดในโหมด 'ฟอร์ม' โดยมีตารางข้อมูลส่วนบุคคลของตัวเองหรือคุณสามารถผสมทั้งสองอย่างในแอพเดียว Google ด่วนเปิดเผยสิ่งนี้: stackoverflow.com/questions/2250921/…
Beau D'Amore

<identity impersonate = "true" /> อาจจำเป็นต้องเปลี่ยนถ้ามีการผสม
Beau D'Amore

2

ใน Asp.net Mvc Identity 2 คุณสามารถรับชื่อผู้ใช้ปัจจุบันได้โดย:

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

1

ในตัวจัดการ IIS ภายใต้การรับรองความถูกต้องปิดใช้งาน: 1) การรับรองความถูกต้องแบบไม่ระบุชื่อ 2) การรับรองความถูกต้องของฟอร์ม

จากนั้นเพิ่มสิ่งต่อไปนี้ลงในคอนโทรลเลอร์ของคุณเพื่อจัดการทดสอบกับการปรับใช้เซิร์ฟเวอร์:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.