ASP.NET CORE 2.0 - [Authorize] не блокирует доступ остальных API к неавторизованному пользователю - PullRequest
0 голосов
/ 12 октября 2018

Я только изучаю ASP.NET CORE.Я успешно реализовал openiddict для защиты моего API.После успешного входа в систему пользователь получает токен, и этот токен используется для доступа к веб-API, но он также позволяет неавторизованному пользователю (то есть тому, у кого токена нет). Вот как я организовал контроллер

namespace ISIA.Controllers
{
  [Authorize]
  [Route("api/[controller]")]
  public class PostController: Controller
  {
    private readonly IPostService _postService;
    private readonly PostToPostViewModelMapper _mapper;
    public PostController(
      IPostService postService
      )
    {
      _postService = postService;
      _mapper = new PostToPostViewModelMapper();
    }


    [HttpPost]
    public ObjectResult SavePost([FromBody] PostViewModel postViewModel)
    {
                 //method body
    }

    [HttpGet]
    public ObjectResult GetAllPost()
    {
       //method body  
    }
  }
}

в статусе

 services.AddOpenIddict(options =>
      {
        options.AddEntityFrameworkCoreStores<ApplicationDbContext>();
        options.AddMvcBinders();
        options.EnableAuthorizationEndpoint("/connect/authorize")
                       .EnableLogoutEndpoint("/connect/logout")
                       .EnableTokenEndpoint("/connect/token")
                       .EnableUserinfoEndpoint("/api/userinfo");
        options.AllowAuthorizationCodeFlow();
        options.RequireClientIdentification();
        options.AllowPasswordFlow();
        options.AllowRefreshTokenFlow();
        options.DisableHttpsRequirement();
        options.UseRollingTokens(); //Uncomment to renew refresh tokens on every refreshToken request
                                    // options.AddSigningKey(new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(Configuration["STSKey"])));
        options.Configure(
          config =>
          {
            // Enable sliding expiration
            config.UseSlidingExpiration = true;
            config.AccessTokenLifetime = TimeSpan.FromMinutes(240);
            config.RefreshTokenLifetime = TimeSpan.FromDays(15);
          });
      });

Что я делаю не так, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 16 августа 2019

В моем случае, я по глупости пытался стать гладким и бросать только

services.AddMvcCore()
    .AddFormatterMappings()
    .AddJsonFormatters()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

в моем ConfigureServices() в ошибочной попытке оптимизировать и быть стройным.Ну, это, должно быть, оптимизировало некоторые основные аспекты аутентификации.Хотя мой обработчик всегда вызывался, каждый запрос все равно поступал к контроллеру.

Решается добавлением в ядро ​​сантехники:

services.AddMvcCore()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .AddFormatterMappings()
    .AddJsonFormatters()
    .AddAuthorization();
0 голосов
/ 12 октября 2018

Установите AuthenticationSchemes в атрибуте Authorize следующим образом:

[Authorize(AuthenticationSchemes = 
    OpenIddictValidationDefaults.AuthenticationScheme)]

Это обеспечит авторизацию с помощью токенов OAuth, а не с помощью cookie-файлов.

OpenIddictValidationDefaults.AuthenticationScheme определено здесь .

Авторизация по определенной схеме задокументирована здесь .

Если это не удастся, что, как указывает ваш комментарий, было сделано, то вам также необходимо настроить обработчик токена .Это будет выглядеть примерно так:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options => 
    {
        options.Audience = "https://localhost:5001/";
        options.Authority = "http://localhost:5000/";
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...