DotNet Core Api - 特定端点的不同身份验证
Posted
技术标签:
【中文标题】DotNet Core Api - 特定端点的不同身份验证【英文标题】:DotNet Core Api - Different Authentication for specific endpoints 【发布时间】:2021-07-20 07:25:03 【问题描述】:我有一个棘手的场景 - 我有一个使用 Jwt 不记名令牌进行身份验证的 Dotnet Core Web api。 我们有一个用例,我们希望为端点子集生成一个稍微不同的不记名令牌——这个不记名令牌与主令牌有不同的声明。 我能够生成新的令牌和声明 - 它已经过系统验证并且可以工作,但我不希望它在所有端点上工作。
应该是这样的: Bearer_token1 => 可以访问所有端点并工作(这是我们当前的不记名令牌) Bearer_token2 => 可以访问一些端点,但不是全部(这是我们的新令牌) endpoint1 只需要使用 bearer_token1。如果用户尝试使用 bearer_token2,他们会收到 401 错误 endpoint2 需要工作 bearer_token1 或 bearer_token2。
我显然可以向每个端点添加代码以查看声明并在需要时使 bearer_token2 失败,但我们有很多端点。
有没有办法指定控制器需要使用特定令牌进行授权?
这有意义吗?
【问题讨论】:
【参考方案1】:您可以根据任何一组要求指定任意数量的不同策略。
默认策略仅检查用户是否已通过身份验证。您可以替换默认策略以指定您在正常登录过程中可以满足的其他一些要求。为您的新登录令牌使用其他一些策略。例如;
services.AddAuthorization(o =>
var builder = new AuthorizationPolicyBuilder();
builder.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
builder.RequireAuthenticatedUser();
builder.RequireClaim(ClaimTypes.Role, "all_access");
o.DefaultPolicy = builder.Build();
o.AddPolicy("OtherPolicy", b =>
b.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
b.RequireAuthenticatedUser();
b.RequireClaim(ClaimTypes.Role, "some_access");
);
【讨论】:
我认为这会起作用 - 我无法同时允许 bearer_token1 和 bearer_token2 对特定控制器进行授权。如果我将 [Authorize(Policy = "SharedToken")] 添加到已经具有 [Authorize] 基础的控制器中的特定端点,则它不允许默认令牌工作 - 我需要它们也可以工作。 您需要以某种方式区分您的令牌,以便将它们的属性链接到您的登录策略。 我最终创建了一个新的自定义策略 RequireAssertion,它允许该策略的新令牌或旧令牌(支持两者),然后将 RequireClaim 添加到默认策略中,以在旧令牌 - 所以现在现有端点禁止新令牌,并且在 [Authorize] 属性中用新策略装饰的端点都接受! MSFT 在这方面做得很好 - 再次感谢您为我指明了这个方向!【参考方案2】:如果您对不同的熊令牌有多个身份验证方案,您可以使用 Authorize 属性来设置 AuthenticationSchemes。
您可以根据您的意见为特定控制器设置 Authorize AuthenticationScheme。如下:
[Authorize(AuthenticationSchemes =
JwtBearerDefaults.AuthenticationScheme)]
【讨论】:
以上是关于DotNet Core Api - 特定端点的不同身份验证的主要内容,如果未能解决你的问题,请参考以下文章
在 dotnet core 上的 swagger (openAPI) UI 中集成运行状况检查端点
dotnet core webapi调用.net webapi2
在 dotnet core web api ::ffff:127.0.0.1 中获取客户端 IP 地址
Dotnet Core API - 获取控制器方法的 URL