In a .NET Core Web API with versioned endpoints (e.g., /api/v1/users
and /api/v2/users
), restricting access to specific API versions based on user subscription type (e.g., “mon premium” for v1, “er premium” for v2) requires:
- API Versioning
- Authorization based on user role/subscription
- Enforcing version access restrictions at the API level
How to restrict access to specific API versions based on subscription type
Step 1: Setup API Versioning in .NET Core Web API
If not already done, install and configure API versioning:
dotnet add package Microsoft.AspNetCore.Mvc.Versioning
In Startup.cs
or Program.cs
:
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.ReportApiVersions = true;
options.ApiVersionReader = new UrlSegmentApiVersionReader(); // version in URL
});
Step 2: Define user subscription/role claims
Your authentication system (e.g., JWT tokens) should include a claim that specifies the user's subscription type:
- For example:
"subscription": "mon"
or"subscription": "er"
.
Step 3: Create a custom Authorization Policy to check API version and subscription
You can create a custom authorization attribute or middleware that:
- Reads the API version from the request.
- Reads the user's subscription from claims.
- Allows or denies access based on the combination.
Example:
public class ApiVersionSubscriptionRequirement : IAuthorizationRequirement
{
public string AllowedVersion { get; }
public string AllowedSubscription { get; }
public ApiVersionSubscriptionRequirement(string allowedVersion, string allowedSubscription)
{
AllowedVersion = allowedVersion;
AllowedSubscription = allowedSubscription;
}
}
public class ApiVersionSubscriptionHandler : AuthorizationHandler<ApiVersionSubscriptionRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ApiVersionSubscriptionRequirement requirement)
{
var httpContext = (context.Resource as AuthorizationFilterContext)?.HttpContext;
if (httpContext == null)
{
context.Fail();
return Task.CompletedTask;
}
// Get requested API version from route data
var requestedVersion = httpContext.GetRequestedApiVersion()?.ToString();
// Get subscription from user claims
var subscriptionClaim = context.User.FindFirst("subscription")?.Value;
if (requestedVersion == requirement.AllowedVersion && subscriptionClaim == requirement.AllowedSubscription)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
return Task.CompletedTask;
}
}
Step 4: Register Authorization Policy and Handler
services.AddAuthorization(options =>
{
options.AddPolicy("MonPremiumV1Only", policy =>
policy.Requirements.Add(new ApiVersionSubscriptionRequirement("1.0", "mon")));
options.AddPolicy("ErPremiumV2Only", policy =>
policy.Requirements.Add(new ApiVersionSubscriptionRequirement("2.0", "er")));
});
services.AddSingleton<IAuthorizationHandler, ApiVersionSubscriptionHandler>();
Step 5: Apply Authorization Policy on Controllers/Endpoints
In your controllers, specify version and apply policy:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/users")]
[Authorize(Policy = "MonPremiumV1Only")]
public class UsersV1Controller : ControllerBase
{
[HttpGet]
public IActionResult GetUserInfoV1()
{
// Implementation for v1
return Ok("User Info V1");
}
}
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/users")]
[Authorize(Policy = "ErPremiumV2Only")]
public class UsersV2Controller : ControllerBase
{
[HttpGet]
public IActionResult GetUserInfoV2()
{
// Implementation for v2
return Ok("User Info V2");
}
}
Step 6: Frontend Handling
- Frontend should call the correct API version based on the user's subscription type.
- Backend authorization policy ensures enforcement even if the frontend tries to call unauthorized versions.
Summary
- Use API Versioning to separate endpoint versions.
- Include subscription info in user claims (JWT or other token).
- Create a custom authorization policy that enforces API version access based on subscription.
- Apply the authorization policy on versioned controllers/endpoints.
- Frontend calls appropriate version per user subscription.