AuthorizeAttribute не влияет на авторизацию с использованием JWT в приложении dotnet core webapi 2.1 - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь использовать JWT в основном приложении webapi.Вот мой Startup.ConfigureServices():

services.AddDbContextPool("Bla Bla");
services.AddIdentity<IdentityUser, IdentityRole>("Bla Bla");

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(o => {
    o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(c => {
    c.RequireHttpsMetadata = false;
    c.SaveToken = true;
    c.TokenValidationParameters = 
        new TokenValidationParameters {
            ValidIssuer = Configuration["JwtIssuer"],
            ValidAudience = Configuration["JwtIssuer"],
            IssuerSigningKey = new SymmetricSecurityKey(
                        Encoding.UTF8.GetBytes(Configuration["JwtKey"])),
            ClockSkew = TimeSpan.Zero
        };
});

services.AddRouting("Bla Bla");
services.AddMvcCore("Bla Bla").AddControllersAsServices();

И это Startup.Configure() метод:

app.UseAuthentication();
app.UseMvc(rb => 
    { rb.MapRoute("api_default", "{controller}/{action}/{id?}"); });

В любом случае, я создал защитное действие для проверки (которое я ожидаювернуть HTTP 401 Unauthorized ошибку):

public class AccountController : ControllerBase {
    [HttpGet]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public async Task<object> Info() {
        return "Authorized!";
    }
}

Но он получает авторизацию и отвечает "Авторизован!"все время.Кажется, атрибут Authorize вообще не влияет.Я что-то упустил?

PS Я попробовал оба атрибута [Authorize] и [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)].

PS2 Я попытался расширить контроллер с ControllerBase и Controller.

PS3 Я пытался без очистки утверждений по умолчанию (убрал эту строку JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();).

Ни одно из них не сработало.

Инфраструктура и пакеты:

  • Целевая структура: netcoreapp2.1
  • Microsoft.AspNetCore Версия = 2.1.6
  • Microsoft.AspNetCore.Authentication.JwtBearer Версия = 2.1.2
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore Версия = 2.1.6
  • Microsoft.AspNetCore.Mvc.Core Версия = 2.1.3

ОБНОВЛЕНИЕ:

Согласно @ sellotape'sкомментарий , я вернул объект User из действия:

[HttpGet]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public async Task<object> Info() {
    return User;
}

А вот вывод JSON:

{
    "identities": [
        {
            "isAuthenticated": false,
            "claims": [],
            "roleClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
            "nameClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
        }
    ],
    "identity": {
        "isAuthenticated": false,
        "claims": [],
        "roleClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
        "nameClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
    },
    "claims": []
}

1 Ответ

0 голосов
/ 25 ноября 2018

Основная проблема в том, что когда вы используете .AddMvcCore(), вы подключаете только небольшую часть того, что вы получаете, когда вместо этого используете .AddMvc().Для многих решений проще использовать последнее, так как вы автоматически добавляете следующее и готовы к использованию [ source ]:

  • API Explorer
  • Авторизация
  • Просмотры
  • Razor View Engine
  • Razor Pages
  • JSON Formatters
  • CORS
  • (несколькодругие)

Если вы предпочитаете добавлять только то, что вам абсолютно необходимо, вы можете вместо этого использовать .AddMvcCore(), но тогда вам нужно явно добавить необходимые вам услуги MVC;например, в этом случае (Авторизация) вам нужно будет

services.AddMvcCore()
        .AddAuthorization();

Обратите внимание, как .AddAuthorization() здесь применяется к результату services.AddMvcCore(), который является IMvcBuilder, not *От 1033 * до services, что является IServiceCollection.

...