Как избежать запроса входа в домен для сайта ASP.Net Core 2 WebAPI - который обрабатывает CORS, а также встроенную безопасность Windows - PullRequest
0 голосов
/ 20 сентября 2018

Я попытался настроить сайт WebAPI с ядром dotnet core 2.1, который будет использоваться для возврата некоторых данных json.

Для проверки подлинности пользователей серверная часть должна использовать проверку подлинности Windows (Windows Integrated Security)использоваться на внутреннем домене Windows.

Поскольку запрос будет сделан из одностраничного приложения на стороне клиента, решение также должно обрабатывать CORS.Наконец, мы также запустим это только в HTTPS.

Итак, клиент отправит запрос на выборку в WebAPI, для которого в запросе установлено credentials=include.

Для обработки CORS я установилна сайте использовать анонимную аутентификацию и аутентификацию Windows, поскольку HTTP-запрос CORS OPTION требует анонимной аутентификации.Однако один метод контроллера имеет атрибут Authorize, так как этот метод потребует учетные данные пользователя.

Проблема заключается в том, что при первом открытии браузера на сайте запрос будет запрашивать у пользователя учетные данные для входа в домен, которые не требуются.

Есть идеи, как к этому подойти?

1 Ответ

0 голосов
/ 20 сентября 2018

Чтобы зарегистрировать класс в WebApiConfig:

config.MessageHandlers.Add(new CorsHandler());

И это класс:

 public class CorsHandler : DelegatingHandler
{
    const string Origin = "Origin";
    const string AccessControlRequestMethod = "Access-Control-Request-Method";
    const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
    const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
    const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
    const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        bool isCorsRequest = request.Headers.Contains(Origin);
        bool isPreflightRequest = request.Method == HttpMethod.Options;
        if (isCorsRequest)
        {
            if (isPreflightRequest)
            {
                return Task.Factory.StartNew<HttpResponseMessage>(() =>
                {
                    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                    response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

                    string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
                    if (accessControlRequestMethod != null)
                    {
                        response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
                    }

                    string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
                    if (!string.IsNullOrEmpty(requestedHeaders))
                    {
                        response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
                    }

                    return response;
                }, cancellationToken);
            }
            else
            {
                return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
                {
                    HttpResponseMessage resp = t.Result;
                    resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
                    return resp;
                });
            }
        }
        else
        {
            return base.SendAsync(request, cancellationToken);
        }
    }
}
...