Asp.net web api 如何在Web API 2中实现令牌端点的版本控制

Asp.net web api 如何在Web API 2中实现令牌端点的版本控制,asp.net-web-api,oauth-2.0,asp.net-identity,bearer-token,api-versioning,Asp.net Web Api,Oauth 2.0,Asp.net Identity,Bearer Token,Api Versioning,我有一个使用基于令牌的身份验证(OAuth2)的Asp.NETWebAPI2 我已经使用实现了Web API版本控制 现在我有了三个不同版本的API。这真的很棒,我现在可以在不影响当前API的情况下更改V3了 但是,/token端点没有版本控制,因为它不在我的控制器中。它在提供者中 我搜索了,但没有找到任何有用的内容。我们可以在Startup.Auth.cs中注册多个令牌端点 以下是我所做的: OAuthOptions = new OAuthAuthorizationServer

我有一个使用基于令牌的身份验证(OAuth2)的Asp.NETWebAPI2

我已经使用实现了Web API版本控制

现在我有了三个不同版本的API。这真的很棒,我现在可以在不影响当前API的情况下更改V3了

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


我搜索了,但没有找到任何有用的内容。

我们可以在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);

因此,现在每个版本都有不同的令牌端点。

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

选项1-使用约定API 如果您的授权端点实际上是一个控制器(尽管我认为它不是),那么您可以像这样使用约定API:

services.addaVersioning(选项=>
{
options.Conventions.Controller();
}
约定专门用于处理控制器可能是外部定义的,而您对源代码没有任何控制权的场景

选项2-使用自定义约定 中间件可以动态创建动作。只要实际生成动作,那么您就可以使用自定义的IControllerConvention。您将被传递到ControllerModel,其中包含您需要版本化的动作。假设这是正确的行为,您将在sour中查找匹配的动作ce模型,然后您可以将其应用于控制器约定,如下所示:

公共类MyConventions:IControllerConvention
{
公共布尔应用(IControllerConventionBuilder控制器、控制器模型控制器模型)
{
var method=//TODO:从controllerModel解析目标方法
if(方法==null)
{
返回false;
}
controller.Action(method.IsApiVersionNeutral();
返回false;
}
}
选项3-在中间件中 如果这是纯中间件,则不直接支持API版本控制。但是,如果管道组成正确,您可以自己支持版本控制。具体而言,API版本控制必须先于中间件的其他部分。这通常会自动发生,但如果您需要控制注册,则需要更改您的设置将手动处理它,如下所示:

services.addaVersioning(options=>options.RegisterMiddleware=false);
//…内部应用程序设置
services.useApVersioning();
API版本控制中间件实际上没有什么特殊功能。它只是添加了一个管道功能。只要在其他中间件之前,它就可以在下游使用,如下所示:

var-feature=context.Features.Get();
//未经分析的原始API版本(如果有)
var rawApiVersion=feature.rawApiVersion;
//如果未指定版本,则解析API版本;将为空
//或者无法分析该值
var apiVersion=feature.apiVersion;
//TODO:在中间件中实施版本控制策略
选项4-使用API资源管理器 如果前面的方法都不适用于您,您可以利用API Explorer扩展进行API版本控制,从发现的API构建配置(如上所述)。这样做的好处是不需要硬编码,也不需要在每次发布新版本时进行更改

您的应用程序启动配置将更改为以下内容:

public void配置(IAApplicationBuilder应用程序、IApiVersionDescriptionProvider提供程序)
{
foreach(provider.ApiVersionDescriptions中的变量描述)
{
var options=新的OAuthAuthorizationServerOptions()
{
TokenEndpointPath=新路径字符串($“/api/{description.GroupName}/Accounts/Token”),
Provider=新的ApplicationAuthProvider2(PublicClientId),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(TokenExpireationInDays),
AllowInsecureHttp=true,
};
应用程序使用OAuthBealerTokens(选项);
}
}

前三个选项是不合适的版本控制方法,因为我的端点不是控制器方法。最后一个选项适用于令牌端点,但我希望每个版本都有不同的实现。选项4将与您提到的(我假设)一致适用于您,但作为所有API版本的循环。如果每个API版本都有特定的自定义或其他策略,则可能需要与定义的API版本相交的映射。例如,您可能有一个工厂,该工厂返回特定API版本的OAuthAuthorizationServerOptions。然后您只需调用
如图所示,使用OAuthBealerTokens(选项)