Я внедрил Службу Отдыха 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");
Итак, я вижу три варианта решения моей проблемы.
- Получите вызов CORS-Options в моем клиенте
Angular
, чтобы как-то передать мои учетные данные Windows.
- Получить службу WCF, чтобы игнорировать аутентификацию в вызове CORS-Options.
- Установите для параметра Авторизация значение Нет и передайте мои учетные данные Windows другим способом (не заставляя пользователя вводить свои учетные данные).
Он также работает даже при аутентификации Windows, когда я использую --disable-web-security
в Chrome Browser
. Но для меня это не решение для производственной системы.
Может быть, у кого-то есть идеи или даже решение моей проблемы.