Asp.Net Web Api请求登录操作过滤器

时间:2018-01-18 13:11:04

标签: c# asp.net-web-api

我需要用户请求登录操作过滤器。

我对我们公司的web api项目进行了一些重构。它有自定义身份验证和授权,我不想更改此部分。

在重构之前,每个方法都会找到具有标题值的请求用户。

[CustomAuthorization]
 public class ContentController : BaseApiController{

 public HttpResponseMessage Post(FromBody request){
   var token=GetFromHeader(request);
    var user=FindUser(token);
    Log.Write(user.Id,started,accessToken)
    Log.WriteDetail(requestContent,user.Id,methodName,accessToken)
    service.Action();
    Log.Write(user.Id,finished,accessToken)
  }
}

每个方法都有代码块显示上面的段落。每个控制器继承自BaseController,我添加了公共属性User和AccesToken等。 我在CustomAuthorization中的OnAuthorization方法上设置了这些属性。

 public override void OnAuthorization(HttpActionContext actionContext)
 {      
        var user=FindUserFromHeader(); 
        var controller = (BaseApiController)actionContext.ControllerContext.Controller;
        controller.User= user;
        controller.ServiceTicket = accessToken;

        actionContext.Request.Properties.Add(new KeyValuePair<string, object>("User", user));
        actionContext.Request.Properties.Add(new KeyValuePair<string, object>("AccessToken", accessToken));
 }

现在,我删除了每种方法都找到用户块。

我想删除每个方法中的日志记录。我添加了自定义ActionFilterAttribute,但我无法获取方法请求内容。

在我的CustomLogAttribute:ActionFilterAttribute中,我得到Post数据但我无法捕获 GET 方法请求内容。如何获得 POST GET 方法。

public override void OnActionExecuting(HttpActionContext actionContext)
        {
            object _customer;
            object _tranId;
            object _serviceTicket;
            actionContext.Request.Properties.TryGetValue("Customer", out _user);

            actionContext.Request.Properties.TryGetValue("AccessToken", out _serviceTicket);
            User= (User)_user;
            ServiceTicket = _serviceTicket.ToString();
            using (var stream = new MemoryStream())
            {
                var context = (HttpContextBase)actionContext.Request.Properties["MS_HttpContext"];
                context.Request.InputStream.Seek(0, SeekOrigin.Begin);
                context.Request.InputStream.CopyTo(stream);
                string requestBody = Encoding.UTF8.GetString(stream.ToArray());
            }

            var content = actionContext.Request.Content.ReadAsStringAsync().Result;
        }

0 个答案:

没有答案