我有一个MVC Web Api项目,并使用MessageHandler记录所有请求和响应。当一个api请求进入时,头中的持有者令牌让Asp.Net完成它的事情,并对用户进行身份验证。因此,消息处理程序知道用户是谁,我们将其写入日志文件。
现在,为了加快使用Cachecow缓存的速度。因此,我在MessageHandler之后添加了cachecow处理程序,当第二个请求进入时,从缓存的角度来看,一切都很好。控制器代码永远不会命中,响应将从缓存中返回。
但是,MessageHandler没有User.Identity的值,所以我无法判断是谁发出了请求。
我需要记录所有请求,即使控制器中的代码没有命中,也要确定是谁发出了这些请求。
我认为一种解决方法是强制api请求在报头中传递持有者令牌和用户id。这样,我就可以检查用户id声明,并使用它来记录是谁发出了请求。
protected override async Task OutgoingMessageAsync(string correlationId, string requestInfo, byte[] message, string responseTimeMilliseconds)
{
await Task.Run(() =>
Debug.WriteLine(string.Format("{0} - Response: {1}\r\n{2}", correlationId, requestInfo, Encoding.UTF8.GetString(message))));
);
}从缓存获取响应时,用户标识为空。
?HttpContext.Current.User.Identity
{System.Security.Claims.ClaimsIdentity}
[System.Security.Claims.ClaimsIdentity]: {System.Security.Claims.ClaimsIdentity}
AuthenticationType: null
IsAuthenticated: false
Name: null有什么想法吗?
发布于 2016-02-05 20:50:39
在认证过程中,设置object:
System.Threading.Thread.CurrentPrincipal = YourUserInformationObject;
此对象需要实现"System.Security.Principal.IPrincipal“示例
public class YourUserInformation : IPrincipal
{
public Int32 Id { get; set; }
public String NameUser { get; set; }
public IIdentity Identity { get; private set; }
public YourUserInformation()
{
this.Identity = new GenericIdentity(NameUser ?? "");
}
public bool IsInRole(string role) { return false; }
}在身份验证过程中,您将对象保存在System.Threading.Thread.CurrentPrincipal中
public void Authentication(AuthorizationContext filterContext)
{
YourUserInformation user = YourMethodGetUserLogin();
System.Threading.Thread.CurrentPrincipal = user ;
}发布于 2016-07-03 18:28:54
你应该从Request创建HttpContext,然后你就可以使用User.Identity object了:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var context = ((HttpContextBase)request.Properties["MS_HttpContext"]);
var uname = username = context.User.Identity.Name;
var response = await base.SendAsync(request, cancellationToken);
return response;
}也可以查看这篇文章:http://arcware.net/logging-web-api-requests/
希望这能帮上忙!
发布于 2016-02-05 03:03:19
试着上车
System.Threading.Thread.CurrentPrincipal
https://stackoverflow.com/questions/35062023
复制相似问题