如何使用身份验证过滤器将标头设置为令牌请求 OAuth?

Posted

技术标签:

【中文标题】如何使用身份验证过滤器将标头设置为令牌请求 OAuth?【英文标题】:How to set header as token request OAuth by using authentication filter? 【发布时间】:2017-04-28 14:39:22 【问题描述】:

我正在开发一个基于 OAuth 的 Web API 应用程序。 如何使用身份验证过滤器将标头设置为我从 OAuth 请求中收到的令牌?

参考链接: Setting Authorization Header of HttpClient

我正在尝试检查所有类型的方法,但它对我不起作用:

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

context.Request.Headers.Add("Bearer", "Your Oauth token");

我的API调用源码是:

[BasicAuthenticator]
[HttpGet]   
[Authorize]
public IEnumerable<string> Get()

    return new string[]  "value1", "value2" ;

我收到了回复:

"Message":"此请求的授权已被拒绝。"

我的令牌生成代码如下:

public class BasicAuthenticator : Attribute, IAuthenticationFilter

    public bool AllowMultiple  get; set;  
    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    
        var req = context.Request;
        var reqHeader = context.Request.Headers;
        if (!reqHeader.Contains("Authorization"))
        
            var pairs = new List<KeyValuePair<string, string>>
            
                new KeyValuePair<string, string>( "grant_type", "password" ),
                new KeyValuePair<string, string>( "username", "xxxx" ),
                new KeyValuePair<string, string> ( "Password", "xxxx" )
            ;
            var content = new FormUrlEncodedContent(pairs);
            var client1 = new HttpClient();
            var response = client1.PostAsync("http://localhost:56672/" + "Token", content).Result;
            var responseBody = response.Content.ReadAsStringAsync();
            var obj = JObject.Parse(responseBody.Result);
            var tokenVal = (string)obj["access_token"];
            client1.DefaultRequestHeaders.Clear();
            client1.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenVal);
        

        return Task.FromResult(0);
    

【问题讨论】:

看这里:***.com/questions/38661090/… 您在哪里生成令牌?在服务器属性 BasicAuthenticator?客户端必须发送令牌才能进行身份验证。检查我之前评论中的链接。 【参考方案1】:

您需要在 API 上定义 Active auth 方案。尝试将[Authorize] 替换为[Authorize(ActiveAuthenticationSchemes = "Bearer")]

【讨论】:

ActiveAuthenticationSchemes 缺少程序集参考?

以上是关于如何使用身份验证过滤器将标头设置为令牌请求 OAuth?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 的 RequestAdapter 将 firebase ID 令牌设置为全局标头?

使用 Angular 和 spring 进行 Jwt 身份验证

在 ember-file-upload 的请求标头中添加身份验证令牌

如果用于身份验证的 JWT 令牌保存在 HTTP-Only cookie 中,您如何从 cookie 中读取它以便我可以将其包含在请求标头中?

如何验证请求标头、JWT 令牌

如何在 api 请求标头中插入 api 身份验证所需的 jwt 令牌?