加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 从ASP.NET WebAPI 2中的头和/或查询字符串中

发布时间:2020-12-16 06:34:00 所属栏目:asp.Net 来源:网络整理
导读:背景: 我有一个ASP.NET WebAPI项目.我正在使用Bearer Tokens来验证我的用户.我的一些控制器操作标有[授权]过滤器.在客户端,客户端通过调用http://foo.bar/Token然后将该令牌作为Authorization标头添加到其请求中来获取其令牌. 到目前为止没有问题,并且我的S
背景:

我有一个ASP.NET WebAPI项目.我正在使用Bearer Tokens来验证我的用户.我的一些控制器操作标有[授权]过滤器.在客户端,客户端通过调用http://foo.bar/Token然后将该令牌作为Authorization标头添加到其请求中来获取其令牌.

到目前为止没有问题,并且我的Startup.Auth.cs类中的所有设置都正常工作:

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),Provider = new ApplicationOAuthProvider(PublicClientId),AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),// In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true                
};

// Enable the application to use bearer tokens to authenticate users
app.USEOAuthBearerTokens(OAuthOptions);

现在我已经为我的项目添加了一些SignalR集线器,我也想验证集线器中的用户.还有一些其他问题涉及客户端如何向SignalR连接添加承载令牌.摘要:

>一种方式是adding it as an ajax default header,由于the JS WebSocket API does not make it possible to set custom headers.的事实而气馁.所以你回退到使用“长轮询”. (不是我想要的)
>另一种方式是creating a custom OAuth Provider and passing the token as query string.这种方法也是不鼓励的,因为it can become a security issue.但是我仍然想要使用这种方法,因为我不想要长轮询.

我试过的:

所以我创建了这个类来从查询字符串中检索我的访问令牌.

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        var value = context.Request.Query.Get("access_token");

        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
        }

        return Task.FromResult<object>(null);
    }
}

然后在客户端,我这样做是为了传递我的访问令牌:

var connection = $.hubConnection();
var hub = connection.createHubProxy('fooHub');
connection.qs = { 'access_token': myAccessToken};
// Init connection

这是一个想法,但是当我想在Startup.Auth.cs类中注册QueryStringOAuthBearerProvider时会出现问题.

以下是我更改Startup.Auth.cs类的方法:

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),// In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true                
};

// Enable the application to use bearer tokens to authenticate users
app.USEOAuthBearerTokens(OAuthOptions);

// Enable the application to retrieve tokens from query string to authenticate users
app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
    Provider = new QueryStringOAuthBearerProvider()
});

所以我想我现在可以使用:

>默认承载令牌,它位于我的WebAPI调用请求的标头中.
>我的SignalR Hub的查询字符串中的自定义访问令牌.

结果:

当我连接到我的集线器时,我可以从查询字符串中检索访问令牌,并对用户进行身份验证.但是当我尝试调用WebAPI控制器操作时,我得到System.InvalidOperationException,表示Sequence包含多个元素.我认为这是因为我正在注册两种方式通过承载令牌验证我的用户,OWIN不喜欢这样.

题:

我怎样才能有两种方法来获得持票人令牌?

> WebApi调用的默认行为(授权标头)
> SignalR Hubs的QueryStringOAuthBearerProvider(查询字符串).

请注意,我不想将访问令牌作为查询字符串传递给我的WebApi操作,而只是传递给SignalR Hub.

解决方法

在盲目地寻找答案的同时,我遇到了一个与我的问题有点类似的 post,并且在评论名称为mahmoud的评论中说道:

I found the problem. Instead of using app.USEOAuthBearerTokens(OAuthOptions) apply app.USEOAuthAuthorizationServer(OAuthOptions).

它适用于我的情况,现在我可以使用这两种方法获得持票人令牌.这是我修改过的Startup.Auth.cs类:

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),// In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true                
};

// Enable the application to use bearer tokens to authenticate users

//app.USEOAuthBearerTokens(OAuthOptions);   // Commented this line.

app.USEOAuthAuthorizationServer(OAuthOptions); // Added this line

// Enable the application to retrieve tokens from query string to authenticate users
app.USEOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
    Provider = new QueryStringOAuthBearerProvider()
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读