gpt4 book ai didi

asp.net-web-api - 从 ASP.NET Web API 2 中的 header 和/或查询字符串中检索不记名 token

转载 作者:行者123 更新时间:2023-12-04 22:58:12 25 4
gpt4 key购买 nike

背景:
我有一个 ASP.NET WebAPI 项目。我正在使用不记名 token 来验证我的用户。我的一些 Controller 操作标有 [Authorized]筛选。在客户端,客户端通过调用 http://foo.bar/Token 来获取他的 token 。然后将该 token 添加为 Authorization其请求的 header 。
到目前为止没有任何问题,一切都在我的 Startup.Auth.cs 中使用这些设置正常工作。类(class):

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 集线器,我也想对集线器中的用户进行身份验证。还有一些其他问题涉及客户端如何将不记名 token 添加到 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 .但我仍然想使用这种方法,因为我不想要长轮询。

  • 我试过的:
    所以我创建了这个类来从查询字符串中检索我的访问 token 。
    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);
    }
    }
    然后在客户端,我这样做是为了传递我的访问 token :
    var connection = $.hubConnection();
    var hub = connection.createHubProxy('fooHub');
    connection.qs = { 'access_token': myAccessToken};
    // Init connection
    这是想法,但当我想注册我的 QueryStringOAuthBearerProvider 时出现问题。在 Startup.Auth.cs类(class)。
    这是我更改 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);

    // Enable the application to retrieve tokens from query string to authenticate users
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
    {
    Provider = new QueryStringOAuthBearerProvider()
    });
    所以我想现在我可以使用:
  • 位于我的 WebAPI 调用请求 header 中的默认不记名 token 。
  • 我的 SignalR 集线器的查询字符串中的自定义访问 token 。

  • 结果:
    当我连接到我的集线器时,我可以从查询字符串中检索访问 token ,并且用户已经过身份验证。但是当我尝试调用 WebAPI Controller 操作时,我得到 System.InvalidOperationExceptionSequence contains more than one element .我认为这是因为我正在注册两种方法来通过不记名 token 对我的用户进行身份验证,而 OWIN 不喜欢那样。
    题:
    我怎样才能有两种方法来获取不记名 token ?
  • WebApi 调用的默认行为(授权 header )
  • QueryStringOAuthBearerProvider (查询字符串)用于 SignalR 集线器。

  • 请注意,我不想将访问 token 作为查询字符串传递给我的 WebApi 操作,而只想传递给 SignalR 集线器。

    最佳答案

    在盲目寻找答案的过程中,遇到了 post 有点类似于我的问题,并且在评论中有人叫 马哈茂德 说过:

    I found the problem. Instead of using app.UseOAuthBearerTokens(OAuthOptions) apply app.UseOAuthAuthorizationServer(OAuthOptions).



    它在我的情况下有效,现在我可以使用这两种方法来获取不记名 token 。这是我修改后的 Startup.Auth.cs类(class):

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

    关于asp.net-web-api - 从 ASP.NET Web API 2 中的 header 和/或查询字符串中检索不记名 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390462/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com