Как использовать базовую проверку подлинности для доступа к API-интерфейсу ASP.NET ASP.NET MVC 4, который использует проверку подлинности Windows с помощью службы Windows?

Вот какой-то фон!

Я разработал небольшой сайт интрасети Asp.Net MVC 4 с использованием шаблона интрасети по умолчанию и использую Windows Authentication. Я также добавил Web Api Controller и написал несколько методов службы REST, в которых я обращаюсь к JQuery с страницы сайта. Web.Config содержит следующее:

<authentication mode="Windows">
<authorization>
 </authorization>
</authentication>

Сайт работает нормально и требует, чтобы пользователь предоставил свои Windows Credentials для доступа к сайту.

вопрос

Я также разрабатываю службу Windows, которая будет работать на другом компьютере в сети и будет получать доступ к одному из действий Windows API controller который я создал на предыдущем шаге. Теперь проблема заключается в том, что я не могу предоставить Windows Credentials для метода RESTful API из службы Windows... поскольку никто не может использовать эту систему... я надеюсь, что у меня получится то, что я имею в виду:

Что я пробовал?

  1. Разрешена Anonymous Authentication True в свойствах веб-проекта. Затем используется атрибут AllowAnonymous по методу web api. Не работал.
  2. Я почему бы не создать еще один AuthorizationFilterAttribute который будет применяться только к методам API, к которым нужно получить доступ из Window Service. Таким образом, новая функциональность переопределит существующую функциональность Windows Authentication и я смогу предоставить имя пользователя/пароль по своему выбору для аутентификации BASIC, которая будет использоваться только из службы Windows. Поэтому я создал новый класс AuthorizationFilterAttribute, воспользовавшись помощью блога Рика Страгла.

    [AllowAnonymous]
    [AuthorizeCallFromWindowsService] 
    public IssueResponse CloseEmployeeLicenses(int userID)
    {
     return null;
    }

Опять же, это не сработало. Для метода API требуются те же учетные данные для проверки подлинности Windows, и я хочу использовать пользовательские жестко закодированные имя пользователя/пароль.

Что бы вы предложили? Заранее спасибо.

1 ответ

У меня был подобный сценарий, и я решил создать новый тип пользователя в нашем приложении, называемом Service User. Мы создали учетную запись службы в домене, и когда мы установили службу Windows на сервере (которая была в той же сети), мы заставили службу Windows работать как учетную запись службы (с сетевым доменом\имя пользователя и пароль). Фактически мы создали 3 служебных аккаунта в нашем приложении, по одному для каждой среды: ServiceAccountDev, ServiceAccountUAT и ServiceAccountPROD, и соответственно отключили/активировали каждую учетную запись.

licensed under cc by-sa 3.0 with attribution.