Используйте две схемы аутентификации JWT, ASP. NET Core 3.1 - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу, чтобы разные методы контроллера аутентифицировались разными JWT.

Startup.cs выглядит следующим образом:

            services
            .AddAuthentication()
            .AddJwtBearer("Schema1", options =>
            {
                ...
                // use JWT Authentication with secretKey1
                var issuerSecretKey = "secretKey1";
                options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(
                    Encoding.ASCII.GetBytes(issuerSecretKey));
            })
            .AddJwtBearer("Schema2", options =>
            {
                ...
                // use JWT Authentication with secretKey2

                var issuerSecretKey = "secretKey2";
                options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(
                    Encoding.ASCII.GetBytes(issuerSecretKey));
            });

        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes("Schema1", "Schema2")
                .Build();
        });

Контроллер

[Authorize(AuthenticationSchemes = "Schema1")]
public ActionResult Method1(int id) 
{ 
  //some code 
}


[Authorize(AuthenticationSchemes = "Schema2")]
public ActionResult Method2(int id) 
{ 
  //some code 
}

После этого я беру Почтальон и выполнить запрос к Method1 с JWT с помощью secretKey2, но он успешно проходит авторизацию! Я использовал этот ответ { ссылка }

Что я должен сделать, чтобы авторизовать Method1 с помощью JWT с помощью secretKey1 и авторизовать Method2 с помощью JWT с помощью secretKey2? Может быть, я должен использовать дополнительные механизмы, такие как политика или роль?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете использовать AddPolicy, чтобы добавить необходимые схемы к каждому Policy, как это

.AddAuthorization(options =>
            {
                options.AddPolicy("Policy1", policy =>
                 {
                     policy.AddAuthenticationSchemes("Schema1");
                     policy.RequireAuthenticatedUser();
                 });
                options.AddPolicy("Policy2", policy =>
                 {
                     policy.AddAuthenticationSchemes("Schema2");
                     policy.RequireAuthenticatedUser();
                 });
            });            

, затем использовать Policy вместо AuthenticationSchemes в Authorize атрибутах

[Authorize(Policy = "Policy1")]
public ActionResult Method1(int id) 
{ 
  //some code 
}

[Authorize(Policy = "Policy2")]
public ActionResult Method2(int id) 
{ 
  //some code 
}

в этом случае Method1 требуется Schema1 и Method2 требуется Schema2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...