在Action Filter上获取用户名

Tam*_*arG 30 c# action-filter asp.net-web-api

我使用Web API的MVC4 Web应用程序.我想创建一个动作过滤器,我想知道哪个用户(登录用户)做了动作.我该怎么做?

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

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
       ??
    }
}
Run Code Online (Sandbox Code Playgroud)

Atu*_*ary 55

回答迟到但如果您在过滤器中使用HttpActionContext,这是最佳解决方案您可以随时使用它,如下所述: -

public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
   if (actionContext.RequestContext.Principal.Identity.IsAuthenticated)
   {
      var userName = actionContext.RequestContext.Principal.Identity.Name;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案就是为什么你应该总是超越接受的答案.+1 (5认同)
  • System.Web.Http.Controllers.HttpActionContext没有RequestContext. (3认同)

Rah*_*hul 36

你可以试试

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

首先检查经过身份验证的用户:

string userName = null;
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
    userName = HttpContext.Current.User.Identity.Name;
}
Run Code Online (Sandbox Code Playgroud)

尝试使用

HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

希望这对你有用

  • 请不要建议在WebApi中使用HttpContext.Current.WebApi是异步的,如果两个请求合在一起,您可以将两个请求数据混合在一起.它似乎可以工作,但绝对不是线程安全的 (8认同)