首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Cachecow时在Web Api处理程序中获取用户Id

使用Cachecow时在Web Api处理程序中获取用户Id
EN

Stack Overflow用户
提问于 2016-01-28 20:51:24
回答 3查看 1.5K关注 0票数 4

我有一个MVC Web Api项目,并使用MessageHandler记录所有请求和响应。当一个api请求进入时,头中的持有者令牌让Asp.Net完成它的事情,并对用户进行身份验证。因此,消息处理程序知道用户是谁,我们将其写入日志文件。

现在,为了加快使用Cachecow缓存的速度。因此,我在MessageHandler之后添加了cachecow处理程序,当第二个请求进入时,从缓存的角度来看,一切都很好。控制器代码永远不会命中,响应将从缓存中返回。

但是,MessageHandler没有User.Identity的值,所以我无法判断是谁发出了请求。

我需要记录所有请求,即使控制器中的代码没有命中,也要确定是谁发出了这些请求。

我认为一种解决方法是强制api请求在报头中传递持有者令牌和用户id。这样,我就可以检查用户id声明,并使用它来记录是谁发出了请求。

代码语言:javascript
复制
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))));

                    );
        }

从缓存获取响应时,用户标识为空。

代码语言:javascript
复制
?HttpContext.Current.User.Identity
{System.Security.Claims.ClaimsIdentity}
    [System.Security.Claims.ClaimsIdentity]: {System.Security.Claims.ClaimsIdentity}
    AuthenticationType: null
    IsAuthenticated: false
    Name: null

有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2016-02-05 20:50:39

在认证过程中,设置object:

System.Threading.Thread.CurrentPrincipal = YourUserInformationObject;

此对象需要实现"System.Security.Principal.IPrincipal“示例

代码语言:javascript
复制
    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中

代码语言:javascript
复制
    public void Authentication(AuthorizationContext filterContext)
    {
       YourUserInformation user = YourMethodGetUserLogin();                

       System.Threading.Thread.CurrentPrincipal = user ;
    }
票数 0
EN

Stack Overflow用户

发布于 2016-07-03 18:28:54

你应该从Request创建HttpContext,然后你就可以使用User.Identity object了:

代码语言:javascript
复制
    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/

希望这能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2016-02-05 03:03:19

试着上车

System.Threading.Thread.CurrentPrincipal

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35062023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档