【问题标题】:DelegatingHandler to add Authorization token to requestDelegatingHandler 将授权令牌添加到请求
【发布时间】:2015-09-17 18:06:04
【问题描述】:

为了下载文件,我需要使用 GET: /API/File/ID?bearerToken=XYZ... 方法。

我创建了一个 DelegatingHandler 来将我的令牌添加到 AuthorizationHeader,但似乎令牌验证可能在此之前完成...

Angular 添加的当前所有令牌,将令牌添加到请求之前的 HTTP 标头中。

public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        ConfigureOAuth(app);
        WebApiConfig.Register(config);
        GlobalFilters.Add(config);
        app.UseWebApi(config);

        config.MessageHandlers.Insert(0, new QueryStringBearerToken());
    }

..

public class QueryStringBearerToken : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            var bearerToken = request.GetQueryNameValuePairs().
                Where(kvp => kvp.Key == "bearertoken")
                .Select(kvp => kvp.Value)
                .FirstOrDefault();

            //QueryString exists and Header doesn't
            if (!string.IsNullOrWhiteSpace(bearerToken) && !request.Headers.Any(x=>x.Key == "Authorization")) 
            {
                request.Headers.Add("Authorization", "Bearer " + bearerToken);
            }

            return base.SendAsync(request, cancellationToken);
        }
    }

【问题讨论】:

    标签: asp.net angularjs asp.net-web-api oauth bearer-token


    【解决方案1】:

    我猜你正在使用 Katana 的 Bearer 中间件? (根据您拨打ConfigureAuth的电话判断?)

    如果是这样,Katana 中间件确实会在 Web API 处理程序之前运行,并在它有机会被处理程序处理之前拒绝您的请求。

    您应该将功能移至 Katana 中间件,而不是创建处理程序。

    这是一个例子:

    public class QueryBearerMiddleware : OwinMiddleware
    {
        public QueryBearerMiddleware(OwinMiddleware next)
            : base(next)
        {
        }
    
        public override async Task Invoke(IOwinContext context)
        {
            string bearerToken = null;
            if (context.Request.QueryString.HasValue)
            {
                var queryPairs = context.Request.QueryString.ToUriComponent()
                    .Substring(1)
                    .Split(new [] {'&'}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]);
                if (queryPairs.ContainsKey("bearertoken"))
                {
                    bearerToken = queryPairs["bearertoken"];
                }
            }
    
            //QueryString exists and Header doesn't
            if (!string.IsNullOrWhiteSpace(bearerToken) && context.Request.Headers.All(x => x.Key != "Authorization"))
            {
                context.Request.Headers.Add("Authorization", new [] { "Bearer " + bearerToken });
            }
    
            await Next.Invoke(context);
        }
    }
    

    您应该注册此中间件以在 Bearer 中间件之前运行。

    在您的ConfigureAuth 的某个地方,您应该致电app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());。我们刚刚创建的这个新中间件,应该是之前注册的,即:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use(typeof(QueryBearerMiddleware));
            var config = new HttpConfiguration();
            ConfigureOAuth(app);
            WebApiConfig.Register(config);
            GlobalFilters.Add(config);
            app.UseWebApi(config);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 2020-01-24
      • 2023-03-23
      相关资源
      最近更新 更多