2013-05-20 23 views
19

我使用帶有Web API的MVC4 Web應用程序。我想創建一個動作過濾器,並且我想知道哪個用戶(一個登錄用戶)做出了動作。我該怎麼做?在Action Filter上獲取用戶名

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

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

回答

28

你可以先嚐試

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

檢查驗證的用戶:

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

嘗試使用

HttpContext.Current.User.Identity.Name 

希望它爲你工作

+0

1.你的意思是「ActionContext的」,而不是「filterContext」 , 對? – TamarG

+0

我使用WebAPI(System.Web.Http.Filters.ActionFilterAttribute),你的解決方案不工作 – TamarG

+1

如果你使用'System.Web.Http.Filters.ActionFilterAttribute'然後只使用'HttpContext.Current.User.Identity.Name '用於獲取用戶名'動作過濾器'..看我更新的答案,並嘗試至少一次。 – Rahul

0

這是你需要

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

我收到一條消息 - 'System.Web.Http.Controllers.HttpActionContext'不包含'HttpContext'的定義,也沒有接受'System.Web.Http.Controllers.HttpActionContext'類型的第一個參數的擴展方法'HttpContext'可以找到(你是否缺少一個使用指令或程序集引用?) – TamarG

+0

我使用System.Web.Http.Filters.ActionFilterAttribute – TamarG

0
HttpContext.Current.User.Identity.Name 
1

也許不是最漂亮的解決方案,但對Web API ActionFilter你可以做以下內容:

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

當然,這僅適用於如果你的控制器實際上是從ApiController繼承的。晚

45

位的答案,但是這是最好的解決辦法,如果你在你的過濾器使用HttpActionContext您可以隨時使用它作爲這裏提到: -

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

這也是線程安全的,我認爲接受的答案不是.. –

+2

System.Web.Http。 Controllers.HttpActionContext沒有RequestContext。 – barrypicker

+0

這是在System.Net.Http和誰問了他的評論中提到他提到的問題,他正在使用Web API –