ASP.NET-基于不同控制器的Jwt令牌

gc0ot86w  于 2022-12-30  发布在  .NET
关注(0)|答案(2)|浏览(135)

我很难理解这一点,也找不到更具体的解决方案。问题如下,我有一个带有许多端点的API,所有端点都使用Authorize和一个用Jwt生成的令牌。我尝试做的是,控制器使用一个独占令牌,我不确定是否可能。也就是说,如果用户有权访问此令牌,则不允许他在其他现有端点中使用它。我还希望不必修改[Authorize]头的其余部分,因为有很多端点。
可以吗?如果不太麻烦的话,你能告诉我怎么处理这个不方便的地方吗?
谢谢大家!
我和你们分享一些实际的代码:

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme => JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                options.SaveToken = true;
                options.RequireHttpsMetadata = false;
                    options.TokenValidationParameters = new     Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    RequireExpirationTime = false,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidAudience = "FULLAPI",
                    ValidIssuer = "FULLAPI",
                    IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey))
                };
            });

尝试使用政策和计划,但没有得到我想要的工作。

vhmi4jdf

vhmi4jdf1#

可以定义多个身份验证方案。

.AddJwtBearer("Scheme1", options =>
{
    options.SaveToken = true;
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        RequireExpirationTime = false,
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidAudience = "FULLAPI",
        ValidIssuer = "FULLAPI",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey))
    };
})
.AddJwtBearer("Scheme2", options =>
{
    options.SaveToken = true;
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        RequireExpirationTime = false,
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidAudience = "FULLAPI",
        ValidIssuer = "FULLAPI",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey2))
    };
});

像这样使用。

[Authorize(AuthenticationSchemes = "Scheme1")]
public IActionResult Get()
{
xxe27gdn

xxe27gdn2#

这是一种更简洁的方法,无需修改现有的[Authorize]属性。
首先,将AddJwtBearer修改如下-

.AddJwtBearer(options =>
               {
                options.Events.OnTokenValidated = context =>
                {
                    var controller = context.HttpContext.Request.RouteValues["controller"];
                    var action = context.HttpContext.Request.RouteValues["action"];
// validation logic goes here
                    return  Task.CompletedTask;
                };
                options.SaveToken = true;
                options.RequireHttpsMetadata = false;
                options.TokenValidationParameters = new     Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    RequireExpirationTime = false,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidAudience = "FULLAPI",
                    ValidIssuer = "FULLAPI",
                    IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecurityKey))
                };
            });

方法之一是将所有端点分组,并使用具有特定端点组的键进行Map,然后在创建令牌时将该键放入声明中。
现在您可以访问controlleraction名称以及令牌上下文,您可以直接检查声明并验证密钥对于当前请求的端点是否有效,如果令牌不满足要求,则发送未授权响应。

相关问题