Моя проблема заключается в том, что моя служба только позволяет моей учетной записи Windows подключиться к ней, но я бы хотел разрешить подключения от любых действительных учетных записей Windows домена. Мой сервис размещен в IIS Express. Когда я просматриваю https://localhost:44300/FileRetrievalService.svc/get
в Google Chrome, я вижу, что мой метод [WebGet]
называется просто отлично. Когда я пытаюсь создать веб-запрос к нему, он также работает, до тех пор, как мне указать свою учетную запись пользователя Windows:Мое веб-приложение отклоняет проверку подлинности Windows для локальной учетной записи Windows
WebRequest request = WebRequest.Create(url);
request.Method = "GET";
request.Headers.Add("Path", filePath);
request.Credentials = new NetworkCredential("username", "password", "localhost");
return request.GetResponse();
Когда я пытаюсь указать другую локальную учетную запись Windows, на моей машине, чтобы проверить подлинность пользователя против мое обслуживание путем изменения "username"
и "password"
в приведенном выше коде на другой счет, который я знаю наверняка существует на моей машине, я получаю следующее сообщение об ошибке:
System.Net.WebException: The remote server returned an error: (401) Unauthorized.
у меня есть следующие в моей службы Web.config
:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithTransportSecurity">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="FileRetrievalPoCV3.FileRetrievalService">
<endpoint behaviorConfiguration="webBehavior" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithTransportSecurity" contract="FileRetrievalPoCV3.IFileRetrieval" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="false"/>
</system.webServer>
</configuration>
В чем причина этой проблемы?
Я собираюсь угадать, что у вашей учетной записи есть admin priveleges, а другая учетная запись - нет. Если это так, вам необходимо явно предоставить разрешения для вашей папки проекта (то есть с помощью проводника Windows) или назначить этого пользователя группе, у которой уже есть разрешение. – Keith
@Keith Вы правы, моя папка проекта не имела прав для моего пользователя, не являющегося администратором. Я добавил разрешения для группы «Пользователи», частью которой является эта учетная запись, и она разрешает соединение. Тем не менее, я нахожу это немного странным, потому что он работал из коробки, когда я сделал программный сервис, который в основном делал то же самое (http://stackoverflow.com/questions/31326727/cant-get-certificate-message-credentials -в-работа-в-моем-ФОС-службы). Единственное различие заключается в том, что теперь я размещаюсь в IIS Express. Почему это может быть? Из-за ИИС? – Alexandru
@ Keith О, я понимаю, почему сейчас. Как IIS Express, так и хостинг-сайт IIS, фактический сервисный файл должен быть предоставлен пользователю, что означает, что IIS Express и IIS используют рефлексию, чтобы попытаться получить файл, используя привилегии этого пользователя. Я получаю это сейчас. – Alexandru