如何在Web API 2中实现令牌端点的版本控制

问题描述 投票:0回答:2

我有一个使用基于令牌的身份验证(OAuth2)的Asp.Net Web API 2。

我已经使用aspnet-api-versioning实现了Web API版本控制。

所以现在我有三个不同版本的API。真的很棒,我现在可以更改V3,而不会影响当前的API。

但是/token端点未版本控制,因为它不在我的控制器中。在提供者中。

我搜索了但找不到任何有用的东西。

asp.net-web-api oauth-2.0 asp.net-identity bearer-token api-versioning
2个回答
0
投票

我们可以在Startup.Auth.cs中注册多个令牌终结点

所以这就是我所做的:

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(TokenExpirationInDays),
            AllowInsecureHttp = true, //Allow HTTP to send username password.
        };
        app.UseOAuthBearerTokens(OAuthOptions);

        OAuthOptionsV3 = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/api/V3/Accounts/Token"),
            Provider = new ApplicationOAuthProvider2(PublicClientId),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(TokenExpirationInDays),
            AllowInsecureHttp = true, //Allow HTTP to send username password.
        };
        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptionsV3);

所以现在每个版本都有不同的令牌终结点。


0
投票

我对这种特殊的设置不熟悉,但这看起来像中间件。这里没有足够的信息可以为您提供具体的答案,但是您的目标应该可以通过以下几种方式之一实现:

选项1-使用Conventions API

如果您的授权端点实际上是一个控制器(尽管我认为不是),则可以像这样使用Conventions API

services.AddApiVersioning(options =>
{
    options.Conventions.Controller<OAuthController>().IsApiVersionNeutral();
}

Conventions专门用于处理可能在外部定义控制器且您无法控制源代码的情况。

选项2-使用自定义约定

中间件可以动态创建动作。只要实际产生动作,就可以使用自定义IControllerConvention。您将通过ControllerModel,其中包含您需要版本化的操作。假设这是正确的行为,您将在源模型中寻找匹配的动作,然后可以使用类似的方法将其应用于控制器约定:

public class MyConventions : IControllerConvention
{
  public bool Apply(IControllerConventionBuilder controller, ControllerModel controllerModel)
  {
    var method = // TODO: resolve the target method from controllerModel

    if (method == null)
    {
      return false;
    }

    controller.Action(method).IsApiVersionNeutral();
    return false;
  }
}

选项3-在中间件中

如果这是纯中间件,则不直接支持API版本控制。但是,如果管道组成正确,则可以自己支持版本控制。具体来说,API版本控制必须先于其他需要它的中间件。这通常是自动发生的,但是如果您需要控制注册,则需要更改设置以手动处理它,如下所示:

services.AddApiVersioning(options => options.RegisterMiddleware = false);

// ... inside application setup
services.UseApiVersioning();

API版本控制中间件实际上并没有做很多特别的事情。它仅添加了管道功能。只要在其他中间件之前,它就可以像这样在下游使用:

var feature = context.Features.Get<IApiVersioningFeature>();

// the raw, unparsed API version, if any
var rawApiVersion = feature.RawApiVersion;

// the parse API version; will be null if no version is specified
// or the value cannot be parsed
var apiVersion = feature.ApiVersion;

// TODO: enforce versioning policies within the middleware

选项4-使用API​​资源管理器

如果以前的方法都不适合您,则可以利用API资源管理器扩展进行API版本控制,从发现的API构建配置(如上所述)。这样的好处是,您每次发布新版本时都不会进行硬编码或需要进行更改。

您的应用程序启动配置将变为如下所示:

public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider)
{
  foreach (var description in provider.ApiVersionDescriptions)
  {
    var options = new OAuthAuthorizationServerOptions()
    {
      TokenEndpointPath = new PathString($"/api/{description.GroupName}/Accounts/Token"),
      Provider = new ApplicationOAuthProvider2(PublicClientId),
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(TokenExpirationInDays),
      AllowInsecureHttp = true,
    };

    app.UseOAuthBearerTokens(options);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.