2013-05-20 32 views
19

Tôi sử dụng ứng dụng web MVC4 với API Web. Tôi muốn tạo một bộ lọc hành động và tôi muốn biết người dùng nào (người dùng đã đăng nhập) đã thực hiện hành động. Tôi làm nó như thế nào?Nhận tên người dùng trên bộ lọc hành động

public class ModelActionLog : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(SHttpActionContext actionContext) 
    { 
     string username = ?? 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     ?? 
    } 
} 

Trả lời

28

Bạn có thể thử

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
     { 
      string username = HttpContext.Current.User.Identity.Name; 
     } 

Kiểm tra cho người sử dụng đã xác thực đầu tiên:

string userName = null; 
if (HttpContext.Current.User.Identity.IsAuthenticated) 
{ 
    userName = HttpContext.Current.User.Identity.Name; 
} 

Cố gắng sử dụng

HttpContext.Current.User.Identity.Name 

Hy vọng nó sẽ làm việc cho bạn

+0

1. Bạn có nghĩa là 'actionContext', không 'filterContext' , đúng? – TamarG

+0

Tôi sử dụng WebAPI (System.Web.Http.Filters.ActionFilterAttribute), giải pháp của bạn không hoạt động – TamarG

+1

nếu ur sử dụng 'System.Web.Http.Filters.ActionFilterAttribute' sau đó chỉ cần sử dụng' HttpContext.Current.User.Identity.Name 'để nhận Tên người dùng trên' Bộ lọc hành động'..xem câu trả lời cập nhật của tôi và thử ít nhất một lần. – Rahul

0

Đây là những gì bạn cần

string username = filterContext.HttpContext.User.Identity.Name; 
+1

Tôi nhận được thông báo - 'System.Web.Http.Controllers.HttpActionContext' không chứa định nghĩa cho 'HttpContext' và không có phương thức mở rộng 'HttpContext' chấp nhận đối số đầu tiên của loại 'System.Web.Http.Controllers.HttpActionContext' có thể được tìm thấy (bạn đang thiếu một chỉ thị bằng cách sử dụng hoặc một tham chiếu lắp ráp?) – TamarG

+0

Tôi sử dụng System.Web.Http.Filters.ActionFilterAttribute – TamarG

0
HttpContext.Current.User.Identity.Name 
1

Có lẽ không phải là giải pháp đẹp nhất, nhưng đối với Web API ActionFilter bạn có thể làm như sau:

var controller = (actionContext.ControllerContext.Controller as ApiController); 
var principal = controller.User; 

Tất nhiên, điều này chỉ áp dụng nếu bộ điều khiển của bạn thực sự kế thừa từ ApiController.

45

Bit trễ cho một câu trả lời nhưng đây là giải pháp tốt nhất nếu bạn đang sử dụng HttpActionContext trong bộ lọc của bạn Bạn luôn có thể sử dụng nó như đã đề cập ở đây: -

public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
{ 
    if (actionContext.RequestContext.Principal.Identity.IsAuthenticated) 
    { 
     var userName = actionContext.RequestContext.Principal.Identity.Name; 
    } 
} 
+4

Đây cũng là chủ đề an toàn và tôi nghĩ rằng câu trả lời được chấp nhận là không .. –

+2

System.Web.Http. Controllers.HttpActionContext không có RequestContext. – barrypicker

+0

nó nằm trong System.Net.Http và người đã hỏi câu hỏi này được đề cập trong một nhận xét của anh ấy rằng anh ấy đang sử dụng API Web –

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