Как я могу добавить аутентификацию токена в свои IIS, чтобы защитить файлы в папке?

У меня есть приложение Windows Azure WebAPI с

  • Owin
  • Oauth 2
  • аутентификация токена
  • Identity 2 Framework
  • Обновление VS2013 2
  • IIS (я не уверен, какая версия. Поскольку я только что обновил все в стеке, я предполагаю последнюю версию)

Прежде чем пользователь будет аутентифицирован, когда есть <script> в моем файле index.html, я замечаю файлы cookie, отправленные на сервер, которые выглядят следующим образом:

Accept-Language: en-US,en;q=0.8
Cookie: .AspNet.Cookies=GWLL4LgeFkn7jDndAwf-Pk_eZAPZ5LYZugSmv- ...

После аутентификации пользователя я замечаю, что изменения cookie:

Accept-Language: en-US,en;q=0.8
Cookie: .AspNet.Cookies=OqLMSpIv2aQ8KUcw3pWdAYtPYUI_tYMl4rEYKe16N ...

Я думал, что использую аутентификацию на токена, поэтому мой первый вопрос: "Почему файлы cookie меняются и почему они отправляются вообще"?

Как только пользователь будет аутентифицирован, то с каждым запросом $http на сервер я отправляю заголовок следующим образом:

Authorization: Bearer abcdefgetc....

Моя авторизация на сервере работает, когда у меня есть методы WebAPI, например:

[Authorize(Roles = "Admin")]

Вот главная веб-конфигурация, в которой показаны параметры безопасности:

<system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
</system.web>
<system.webServer>
    <modules>
      <remove name="FormsAuthenticationModule" />
    </modules>
</system.webServer>

Теперь я хотел бы добавить некоторую безопасность к некоторым статическим файлам javascript, которые у меня есть на сервере. Я знаю, как я могу закодировать его, чтобы файлы могли быть получены моим клиентом и добавлены в DOM двумя способами. В любом случае, это нормально для меня, хотя я предпочитаю первый вариант, если, когда я это сделаю, тогда аутентификация может произойти с помощью файлов cookie или иначе:

С тегом script и загрузкой

var el = doc.createElement("script"),
loaded = false;
el.onload = el.onreadystatechange = function () {
  if ((el.readyState && el.readyState !== "complete" && el.readyState !== "loaded") || loaded) {
    return false;
  }
  el.onload = el.onreadystatechange = null;
  loaded = true;
  // done!
};
el.async = true;
el.src = path;
document.getElementsByTagName('head')[0].insertBefore(el, head.firstChild);

С вызовом $http, а затем добавив его непосредственно в DOM (я могу поставить токен на предъявителя)

$http({
    url: '/Bundles/admin/admin1Bundle.js',
    method: "GET"
})
.success(function (result) {
   var m = document.createElement('script');
   m.appendChild(document.createTextNode(result));
   document.getElementsByTagName('head')[0].appendChild(m);

После добавления javascript становится доступным. Чтобы добавить безопасность, я создал файл web.config в папке для защиты этих файлов и разрешил доступ только к пользователям с Администратор:

Ниже приведена папка web-config, в которой указаны параметры безопасности:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <authorization>
        <remove users="*" roles="" verbs="" />
        <add accessType="Allow" roles="Admin" verbs='GET'/>
      </authorization>
    </security>
  </system.webServer>
</configuration>

Когда пользователь с ролью Admin пытается получить доступ к файлам в папке с GET, в которой имеет токен-носитель, они получают сообщение с сообщением:

Most likely causes:
•No authentication protocol (including anonymous) is selected in IIS.
•Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.
•Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.
•The Web server is not configured for anonymous access and a required authorization header was not received.
•The "configuration/system.webServer/authorization" configuration section may be explicitly denying the user access.

This error occurs when the WWW-Authenticate header sent to the Web server is not supported by the 
server configuration. Check the authentication method for the resource, and verify which authentication 
method the client used. The error occurs when the authentication methods are different. To determine 
which type of authentication the client is using, check the authentication settings for the client.

Похоже, что мой IIS (версия, которую я использую в моей среде разработки, когда я нажимаю "Отладка" > "Начать отладку" ) использует другой тип аутентификации, который используется моим WebAPI. Может кто-нибудь объяснить мне:

  • Должен ли я использовать <system.web> или <system.webServer> для обеспечения безопасности?
  • Как я могу заставить IIS использовать тот же путь безопасности, что и WebAPI, когда я украшаю свои методы WebAPI? Обратите внимание, что мне нужен способ сделать это с помощью web.config, поскольку у меня нет доступа к изменениям в IIS сразу после публикации приложения в облаке.
  • Я использую аутентификацию по токенам, так почему сообщение отправлено? Могу ли я просто использовать эту информацию о файлах cookie, чтобы защитить файлы javascript от загрузки?

Примечания:

Вот как я установил аутентификацию в Startup.Auth.cs

        // Configure the application for OAuth based flow
        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

Ответ 1

Должен ли я использовать или для безопасности? Как я могу заставить IIS использовать тот же путь безопасности, что и WebAPI? когда я украшаю свои методы WebAPI? Обратите внимание, что мне нужен способ сделать это с web.config, поскольку у меня нет доступа к изменениям в IIS непосредственно после публикации приложения в облаке.

Вы можете использовать атрибут авторизации в webconfig для ограничения файлов и папок, приведенный ниже пример ограничивает ограничение только определенного файла js только администраторами.

<location path="resources/scripts/yourtopsecretjsfile.js">
     <system.webServer>
         <security>
             <authorization>
                 <remove users="*" roles="" verbs="" />
                 <add accessType="Allow" roles="Administrators" />
             </authorization>
         </security>
     </system.webServer>
 </location>

Я использую аутентификацию по токенам, поэтому почему отправляется информация о файлах cookie?

Он используется сервером для идентификации аутентифицированного пользователя. Если вы не хотите обойтись без отправки информации о файлах cookie, вы можете посмотреть, как это сделать при отправке подписанного токена с каждым запросом. Ознакомьтесь с этой статьей, свободно освещающей, как это сделать (но это с точки зрения angular JS/Web API 2) http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/