.NET Core проверка подлинности Windows - Реакт против почтальона - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть эта проблема, которая сводит меня с ума ... У меня есть бэкэнд API, который включает CORS и проверку подлинности Windows, выглядит так

launchSettings.json:

"iisSettings": {
   "windowsAuthentication": true,
   "anonymousAuthentication": false,
   ....
}

Запуск.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}

И

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.UseRouting();
     app.UseAuthentication();
     app.UseAuthorization();

     app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyHeader()
        .AllowAnyMethod());

     app.UseEndpoints(endpoints =>
     {
         endpoints.MapControllers();
      });
}

TokenController.cs

[ApiController]
[Route("[controller]")]
public class TokenController : ControllerBase
{
    private TokenService userService;
    IHttpContextAccessor httpContextAccessor;

    public TokenController(TokenService _userService, 
                           IHttpContextAccessor _httpContextAccessor)
    {
        userService = _userService;
        httpContextAccessor = _httpContextAccessor;
    }

    /// <summary>
    /// Creates token for domain signed user of Unicredit group
    /// </summary>
    /// <returns>Authenticate</returns>
    [HttpGet]
    [Route("")]
    [ProducesResponseType(typeof(string), 200)]
    [ProducesResponseType(typeof(string), 400)]
    [ProducesResponseType(typeof(string), 404)]
    [Produces("application/json")]
    public IActionResult Authenticate()
    {
        string username = httpContextAccessor.HttpContext.User.Identity.Name;
        ... further reading from AD and making JWT token 
    }

React - Authenticate.js (делает простую выборку)

fetch(`${AuthenticationEndpoint}/`)
     .then(response => response.json())
     .then(data => this.onSetResult(data));

Поэтому, когда я вызываю свой API с использованием Boomerang (как у почтальона) и просто делаю простой GET для https://localhost:{port}/Token/, я получаю status 200 и мой токен JWT обратно, но как только я получаю данные из своего приложения ReactЯ получаю сообщение об ошибке:

Access to fetch at 'https://localhost:44351/Token/' from origin 'http://localhost:3000' has been blocked by CORS policy

Я понимаю, что ни Бумеранг, ни Почтальон не ограничены политикой, и именно поэтому они могут перейти к моему API, но как я могу позволить своему приложению получить доступ к моемуAPI?

1 Ответ

1 голос
/ 07 ноября 2019

ИСПРАВЛЕНО

Поскольку у меня было

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,

Мои cors ожидали имя пользователя, которое мне нужно для запроса AD и создания токена JWT

Мне пришлось изменить fetch и установить credentials на include и изменить useCors в Startup.cs

fetch(`${AuthenticationEndpoint}/Authenticate`, {
            credentials: "include",
            method: "GET",
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        }).then((response) => {
            response.json().then(data => {
                this.onSetResult(data);
            })
 });

И CORS на бэкенде были установлены так:

 app.UseCors(builder => builder.WithOrigins("http://localhost:3000")
                               .AllowAnyMethod()
                               .AllowAnyHeader()
                               .AllowCredentials());
...