Обрабатывать CORS в рамках аутентификации WCF и Windows - PullRequest
0 голосов
/ 05 июля 2018

Я внедрил Службу Отдыха WCF и соответствующий Клиент Angular CLI. У меня возникли проблемы с CORS, но я смог решить их, когда HttpClientCredentialType.None установлен в WebHttpBinding.

Проблема в том, что мне нужно использовать HttpClientCredentialType.Windows, потому что я должен знать личность пользователя Windows, использующего систему.
Вот используемая привязка:

new WebHttpBinding
{
    MaxBufferSize = int.MaxValue,
    MaxBufferPoolSize = 524288,
    MaxReceivedMessageSize = int.MaxValue,                
    OpenTimeout = TimeSpan.FromMinutes(1),
    SendTimeout = TimeSpan.FromMinutes(1),
    ReceiveTimeout = TimeSpan.FromMinutes(10),
    CloseTimeout = TimeSpan.FromMinutes(1),
    ReaderQuotas =
    {
        MaxStringContentLength = int.MaxValue,
        MaxArrayLength = int.MaxValue,
        MaxDepth = int.MaxValue,
        MaxNameTableCharCount = int.MaxValue
    },
    Security =
    {
        Mode = WebHttpSecurityMode.Transport,
        Transport = { ClientCredentialType = HttpClientCredentialType.Windows }
        //Transport = { ClientCredentialType = HttpClientCredentialType.None}
    }
};

Но теперь вызов CORS-Options отклоняется с помощью HttpStatus 401 Unauthorized, поскольку в нем нет заголовка аутентификации. Поэтому весь призыв отклонен (что правильно ... в теории).

Конечно, я уже добавил все необходимые заголовки. Как уже говорилось, он работает с None аутентификацией.

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "http://localhost:4200");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, Id, Origin, Authorization");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Credentials", "true");

Итак, я вижу три варианта решения моей проблемы.

  1. Получите вызов CORS-Options в моем клиенте Angular, чтобы как-то передать мои учетные данные Windows.
  2. Получить службу WCF, чтобы игнорировать аутентификацию в вызове CORS-Options.
  3. Установите для параметра Авторизация значение Нет и передайте мои учетные данные Windows другим способом (не заставляя пользователя вводить свои учетные данные).

Он также работает даже при аутентификации Windows, когда я использую --disable-web-security в Chrome Browser. Но для меня это не решение для производственной системы.

Может быть, у кого-то есть идеи или даже решение моей проблемы.

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Разве вы не можете просто добавить global.asax и добавить заголовок Access-Control-Allow-Origin

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://YourDomain");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");

        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}
0 голосов
/ 11 июля 2018

Здесь можно использовать Microsoft.AspNet.WebApi.Cors .

Я столкнулся с этой проблемой с помощью Web Api и нашел это решение (пакет nuget), которое также хорошо работает с WCF.

вам нужно использовать этот декоратор над вашим классом:

[EnableCors(origins: "http://example.com", headers: "*", methods: "*")]

и затем над вашим методом добавьте декоратор:

[AcceptVerbs("POST")]

Это будет игнорировать запрос перед полетом и будет отправлять только ваш фактический запрос.

EDIT

немного посмотрев на ваш код, я понял проблему: вам нужен дополнительный параметр:

var cors = new EnableCorsAttribute("http://IP:PORT", "*", "*") { SupportsCredentials = true };
config.EnableCors(cors); 

На asp.net форумах есть отличное сообщение, чтобы помочь в вашей ситуации.

по запросу

Вот обходной путь для HttpConfiguration в wcf.

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