2013-05-20 7 views
19

Ich benutze MVC4 Web-Anwendung mit Web-API. Ich möchte einen Aktionsfilter erstellen und möchte wissen, welcher Benutzer (ein angemeldeter Benutzer) die Aktion ausgeführt hat. Wie kann ich es tun?Get Benutzername auf Aktion Filter

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

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

Antwort

28

können Sie versuchen,

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

prüfen für authentifizierte Benutzer zuerst:

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

Versuchen zu verwenden

HttpContext.Current.User.Identity.Name 

Hoffe, dass es für Sie arbeitet

+0

1. Sie meinen ‚Action‘, nicht ‚filterContext‘ , Recht? – TamarG

+0

Ich benutze WebAPI (System.Web.Http.Filters.ActionFilterAttribute), Ihre Lösung nicht – TamarG

+1

funktioniert, wenn ur mit 'System.Web.Http.Filters.ActionFilterAttribute' dann benutzen Sie einfach' HttpContext.Current.User.Identity.Name 'um den Benutzernamen auf' Action Filter' zu erhalten..siehe meine aktualisierte Antwort und versuche es mindestens einmal. – Rahul

0

Dies ist, was Sie

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

Ich bekomme eine Nachricht - 'System.Web.Http.Controllers.HttpActionContext' enthält keine Definition für 'HttpContext' und keine Erweiterungsmethode 'HttpContext' akzeptiert ein erstes Argument vom Typ 'System.Web.Http.Controllers.HttpActionContext' könnte gefunden werden (fehlt Ihnen eine Using-Direktive oder eine Assembly-Referenz?) – TamarG

+0

Ich benutze System.Web.Http.Filters.ActionFilterAttribute – TamarG

0
HttpContext.Current.User.Identity.Name 
1

Vielleicht nicht die schönste Lösung, sondern auch für Web-API benötigen Action Sie Folgendes tun:

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

Natürlich gilt dies nur, wenn Ihre Controller tatsächlich von ApiController erben.

45

Bit spät für eine Antwort, aber dies ist beste Lösung, wenn Sie HttpActionContext in Ihrem Filter verwenden Sie immer es hier wie erwähnt verwenden: -

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

Dies ist auch thread sicher und ich denke, akzeptierte Antwort ist nicht .. –

+2

System.Web.Http. Controllers.HttpActionContext verfügt nicht über RequestContext. – barrypicker

+0

ist es in System.Net.Http und der Typ, der diese Frage in einem seiner Kommentare erwähnt hat, dass er Web-API verwendet –

Verwandte Themen