Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net DelegatingHandler向请求添加授权令牌_Asp.net_Angularjs_Asp.net Web Api_Oauth_Bearer Token - Fatal编程技术网

Asp.net DelegatingHandler向请求添加授权令牌

Asp.net DelegatingHandler向请求添加授权令牌,asp.net,angularjs,asp.net-web-api,oauth,bearer-token,Asp.net,Angularjs,Asp.net Web Api,Oauth,Bearer Token,为了下载文件,我需要使用GET:/API/File/ID?bearerToken=XYZ。。。方法 我已经创建了一个DelegatingHandler来将我的令牌添加到AuthorizationHeader中,但是似乎令牌验证可以在这一点之前完成 通过在请求之前将令牌添加到HTTP头,可以添加当前的所有令牌 public void Configuration(IAppBuilder app) { var config = new HttpConfiguration();

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

我已经创建了一个DelegatingHandler来将我的令牌添加到AuthorizationHeader中,但是似乎令牌验证可以在这一点之前完成

通过在请求之前将令牌添加到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类QueryStringBearerToken:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
var bearerToken=request.GetQueryNameValuePairs()。
其中(kvp=>kvp.Key==“BealerToken”)
.Select(kvp=>kvp.Value)
.FirstOrDefault();
//QueryString存在,但标头不存在
if(!string.IsNullOrWhiteSpace(bearerToken)&&!request.Headers.Any(x=>x.Key==“授权”))
{
添加(“授权”、“持票人”+持票人);
}
返回base.sendaync(请求、取消令牌);
}
}

我猜您正在使用Katana的承载中间件?(通过调用
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);
    }
}
您应该注册此中间件,使其在LWARE之前运行

ConfigureAuth
中的某个地方,您应该可以调用
app.useAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions())。我们刚刚创建的这个新中间件应该在之前注册,即:

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);
    }
}
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);
    }
}