.NET Web API 2 OWIN承载令牌认证直接调用

Mar*_*vin 7 validation asp.net-web-api

我的Web Api项目有问题.我有文件存储在我的数据库中,并希望直接在新窗口中调用它们来查看/保存(URL如:/ api/Files/5 - 5 beeing FileId)

我正在使用Bearer Token处理我的一般AJAX请求,使用AngularJS获取普通数据,它就像一个魅力.对于该文件,我创建了一个Controller,它在浏览器中显示具有相应MIME类型的文件.但现在我改变了行动[授权]我得到拒绝访问这是正确的,因为我没有通过的HTTP标头的的access_token.

如果可以通过查询字符串传递令牌但是没有找到任何有用的东西,我做了一些研究.

现在我的计划是从我的Controller中删除[Authorize]属性并尝试自己验证令牌,但我不知道如何.

有谁知道我怎么能让它工作?

小智 30

我在我的应用程序(AngularJS,WebAPI 2)中实现了承载令牌身份验证,我遇到了类似的问题 - 我需要通过单击链接来下载文件.当您单击链接时,不会发送标题.:(所以,我在查询字符串中发送了令牌值来下载文件

.../mywebapp/API /文件/ GETFILE/3?=的access_token ... jaCOTrGsaak6Sk0CpPc1

并将"Authorization"标头设置为Startup.Auth.cs中的标记值.这是代码:

public void ConfigureAuth(IAppBuilder app)
{
    //It needs for file downloads
    app.Use(async (context, next) =>
    {
        if (context.Request.QueryString.HasValue)
        {
            if (string.IsNullOrWhiteSpace(context.Request.Headers.Get("Authorization")))
            {
                var queryString = HttpUtility.ParseQueryString(context.Request.QueryString.Value);
                string token = queryString.Get("access_token");

                if (!string.IsNullOrWhiteSpace(token))
                {
                    context.Request.Headers.Add("Authorization", new[] { string.Format("Bearer {0}", token) });
                }
            }
        }

        await next.Invoke();
    });
    // Enable the application to use bearer tokens to authenticate users
    app.UseOAuthBearerTokens(OAuthOptions);
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*ger 1

尽管我不确定这是一个好主意,但您可以实施 aDelegatingHandler来实现您想要的目标。

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

        if(!String.IsNullOrEmpty(bearerToken))
        {
            request.Headers.Add("Authorization", "Bearer " + bearerToken);
        }
        return base.SendAsync(request, cancellationToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

该处理程序将查找名为的查询字符串"bearerToken",如果存在,则将其添加到请求标头中,以便后续处理程序/过滤器进行处理。您可能需要首先检查标头是否已经存在并且在这种情况下不被覆盖。您可以按照通常的方式在配置阶段添加此处理程序:

config.MessageHandlers.Insert(0, new QueryStringBearerToken ());
Run Code Online (Sandbox Code Playgroud)

的请求/YourRoute?bearerToken=theToken将传入DelegatingHandler,将查询字符串中传递的令牌添加到原始请求中的标头列表中,常规的承载令牌身份验证将查找该标头并找到它。