Так что некоторое время назад я создал веб-api для регистрации, который использует все наше приложение.Получение несанкционированного доступа: доступ запрещен на веб-сайте api
В dev, он отлично работает. Это проработало месяц, и все внезапно перестали работать. Насколько я знаю, на сайте prod ничего не изменилось.
Если я попал в webapi напрямую, он работает. Это когда я использую сайт, вызывающий api, тогда возникает проблема.
Я проверил, настройки IIS между dev и prod одинаковы. (И проверка подлинности Windows, и ее расширенные настройки одинаковы, анонимный отключен.)
Оба сайта используют тот же пул приложений (сайт клиента и сайт api). С учетными записями домена как личность.
Я сделал файл сравнения между dev и prod из web.config и applicationhost.config, и ничего не кажется необычным.
У меня заканчиваются идеи о том, что проверить.
Web апи контроллер
[Authorize]
public class ValuesController : ApiController
{
public string Get(string samAccountName, bool success, string permissionName)
{
var returnValue = "Failed";
if (!string.IsNullOrWhiteSpace(samAccountName) && !string.IsNullOrWhiteSpace(permissionName))
{
// Do my logging (removed all the try catch etc to simplify thing)
returnValue = "Success";
}
return returnValue;
}
}
код ударить апи на клиенте
/// <summary>
/// This method calls a web api get method to log the call of the audit
/// </summary>
/// <param name="authorityName">This is the name of the permission to check</param>
/// <param name="success">This is the flag to determine if the call was successful.</param>
/// <returns>Returns an Async task</returns>
private async Task WriteToAuditLogAsync(string authorityName, bool success)
{
try
{
using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true }))
{
client.BaseAddress = new Uri(GlobalConfiguration.AuditBaseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var values = string.Format(
CultureInfo.InvariantCulture, GlobalConfiguration.AuditApivalue,
this.userName.ToUpper(CultureInfo.InvariantCulture),
success.ToString(),
authorityName.ToUpper(CultureInfo.InvariantCulture));
// HTTP GET
var response = await client.GetAsync(values, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
}
}
catch (Exception ex)
{
LogWriter.CriticalError(ex);
}
}
Сообщение об ошибке
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
<div class="content-container"><fieldset>
<h2>401 - Unauthorized: Access is denied due to invalid credentials.</h2>
<h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>
</fieldset></div>
</div>
</body>
</html>
Вот разделы web.config
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<customErrors mode="Off" />
<authentication mode="Windows" />
</system.web>
<system.webServer>
<security>
<authorization>
<clear />
<add accessType="Allow" users="*" />
</authorization>
</security>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
DEV IIS войти
2016-07-15 14:26:45 10.9.9.9 GET /ApmApi/api/Values samAccountName=somename&success=True&permissionName=somePermission 80 - 10.9.9.9- - 401 2 5 593
2016-07-15 14:26:53 10.9.9.9 GET /ApmApi/api/Values samAccountName=somename&success=True&permissionName=somePermission 80 Domain\AppPool 10.9.9.9- - 200 0 0 7015
Prod журнал IIS - Похоже, что разрешения будут отправлены ..
2016-07-15 17:09:45 10.9.9.8 GET /ApmApi/api/Values samAccountName=somename&success=True&permissionName=somePermission 80 - 10.9.9.8 - - 401 2 5 546
2016-07-15 17:09:45 10.9.9.8 GET /ApmApi/api/Values samAccountName=somename&success=True&permissionName=somePermission 80 - 10.9.9.8 - - 401 1 3221225581 0
Если вызывающий сайт и сайт API находятся на одном сервере, вы можете столкнуться с предотвращением петли IIS. См. Http://serverfault.com/questions/485006/why-cant-i-log-in-to-a-windows-protected-iis-7-5-directory-on-the-server – howcheng
спасибо, как. Я рассмотрю это с командой ops. Я также рассмотрю ClientCertificateOption.Automatic и httpHandler – Lareau
По какой-то причине это конкретное сообщение об ошибке, когда он был удален, и был заменен другим (я опубликую новый вопрос об этом). Что я узнал, когда попал на сайт с балансировкой нагрузки, я бы получил ошибку выше. Когда я попадаю на сайт напрямую, я получаю 404 .. вздох – Lareau