2017-01-07 1 views
2

Я использую .Net ASP Web API V2 с угловым 1 и Auth0..NET Web API 2 с CORS и угловым не работает на первом сообщении

После первоначального Войти через Auth0 Я получаю следующее сообщение об ошибке:

XMLHttpRequest cannot load localhost:3001/profile. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost:62379' is therefore not allowed access. The response had HTTP status code 500.

Если я обновить Я больше не получаю сообщение об ошибке. Если я очищу данные браузера, я снова получу ошибку, но получаю успех после обновления.

У меня есть CORS включен в конфигурации API с необходимыми пакетами NUGET.

Я попытался следующие решения, потому что я думал, что это был вопрос перед полетом:

1) Обработка ВЫБЕРИТЕ глагол на контроллере и на глобальном уровне, перехватывая запрос. http://www.jefclaes.be/2012/09/supporting-options-verb-in-aspnet-web.html

2) Добавление глагола выбора в качестве одного из принятых глаголов в методе контроллера.

3) Различные ответы, которые я нашел здесь для изменения запроса. ** Я не могу обмениваться ссылками, мой репутатор слишком низок.

т.д.

4) Использование конкретного происхождения вместо *

Контроллер:

[Route("profile")] 
    [EnableCors(origins: "*", headers: "*", methods: "OPTIONS")] 
    public HttpResponseMessage Options() 
    { 
     var resp = new HttpResponseMessage(HttpStatusCode.OK); 
     resp.Headers.Add("Access-Control-Allow-Origin", "*"); 
     resp.Headers.Add("Access-Control-Allow-Methods", "*"); 
     return resp; 
    } 


    [Route("profile")] 
    [EnableCors(origins: "*", headers: "*", methods: "POST")] 
    [HttpPost] 
    public object Post([FromBody]dynamic data) 
    { 
     string email = null; 
     var b = new object(); 
     try 
     { 
     **** Logic **** 
     } 
     catch (Exception ex) 
     { 
     **** Return Error **** 
     } 

     return b; 
    } 

API-Config

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute(
      origins: "*", 
      headers: "*", 
      methods: "*"); 

     // Web API configuration and services 
     config.EnableCors(cors); 

     var clientID = WebConfigurationManager.AppSettings["auth0:ClientId"]; 
     var clientSecret = WebConfigurationManager.AppSettings["auth0:ClientSecret"]; 

     config.MessageHandlers.Add(new JsonWebTokenValidationHandler() 
     { 
      Audience = clientID, // client id 
      SymmetricKey = clientSecret // client secret 
     }); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 





} 

Угловой Запрос

function postLogin() { 
      var loginPackage = []; 
      if (token === null) token = store.get('token'); 
      if (store.get('profile') != null) { 
       loginPackage = store.get('profile'); 
      } 

      return $q(function(resolve, reject) { 
       $http({ 
         method: 'Post', 
         url: BASE + 'profile', 
         data: loginPackage, 
         crossDomain: true, 
         xhrFields: { 
          withCredentials: true 
         }, 
         contentType: 'application/json' 
        }) 
        .success(function(data, status) { 
         *** Logic *** 
         resolve(function() { 
          resolve(true); 
         }); 
        }) 
        .error(function(data, status) { 
          reject(function() { 

          }); 
        }); 
      }); 

     } 

Я думаю, что, возможно, я слишком долго смотрел на это и пропустил что-то довольно простое.

//// **** Обновление **** ////

Ответ:

HTTP/1.1 500 Internal Server Error 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcaWFteWFcRGVza3RvcFxOZXcgZm9sZGVyICgzKVx3ZWJhcGlcQXBpXHByb2ZpbGU=?= 
X-Powered-By: ASP.NET 
Date: Sun, 08 Jan 2017 00:17:26 GMT 
Content-Length: 709 

// * UPDATE * ///

С чистый кэш браузер ЗАПРОС (Сбой)

POST /profile HTTP/1.1 
Host: localhost:3001 
Connection: keep-alive 
Content-Length: 2372 
Accept: application/json, text/plain, */* 
Origin: http://localhost:62379 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Authorization: Bearer null 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost:62379/index.html 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 

Я думал, что это может быть предполетным, но я понимаю, что это будет с глаголом OPTIONS, а не глаголом POST.

Автономность не соответствует действительности.

Authorization: Bearer null 

Отклик:

HTTP/1.1 500 Internal Server Error 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcaWFteWFcRGVza3RvcFxOZXcgZm9sZGVyICgzKVx3ZWJhcGlcQXBpXHByb2ZpbGU=?= 
X-Powered-By: ASP.NET 
Date: Sun, 08 Jan 2017 00:31:49 GMT 
Content-Length: 709 

А второе сообщение отправляется сразу после того, как и успешно.Фактически это предполетно.

Запрос:

OPTIONS /profile HTTP/1.1 
Host: localhost:3001 
Connection: keep-alive 
Access-Control-Request-Method: POST 
Origin: http://localhost:62379 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Access-Control-Request-Headers: authorization, content-type 
Accept: */* 
Referer: http://localhost:62379/index.html 
Accept-Encoding: gzip, deflate, sdch, br 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 

И ответ:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Server: Microsoft-IIS/10.0 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: authorization,content-type 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcaWFteWFcRGVza3RvcFxOZXcgZm9sZGVyICgzKVx3ZWJhcGlcQXBpXHByb2ZpbGU=?= 
X-Powered-By: ASP.NET 
Date: Sun, 08 Jan 2017 00:34:43 GMT 
Content-Length: 0 

Из-за этого я не могу выйти за пределы точки зрения входа. Экран загрузки сидит на ошибке. Если я обновляю и запишу снова, ошибок нет.

Запрос:

POST /profile HTTP/1.1 
Host: localhost:3001 
Connection: keep-alive 
Content-Length: 2367 
Accept: application/json, text/plain, */* 
Origin: http://localhost:62379 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3ltdC5hdXRoMC5jb20vIiwic3ViIjoiZmFjZWJvb2t8MTAxNTM4MjIxOTc4MTIyNTEiLCJhdWQiOiJWWDhHMFMyUWM5cUFjYnRrM09pMVZMa2NkWGxnWlBtZSIsImV4cCI6MTQ4Mzg3MTMyNywiaWF0IjoxNDgzODM1MzI3fQ.HBQcGC6aad2pLaq3nPuhojrFT2b6Usv64p97b-DCRCU 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost:62379/index.html 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 

Поле авторизации теперь имеет маркер вместо пустого значения:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3ltdC5hdXRoMC5jb20vIiwic3ViIjoiZmFjZWJvb2t8MTAxNTM4MjIxOTc4MTIyNTEiLCJhdWQiOiJWWDhHMFMyUWM5cUFjYnRrM09pMVZMa2NkWGxnWlBtZSIsImV4cCI6MTQ4Mzg3MTMyNywiaWF0IjoxNDgzODM1MzI3fQ.HBQcGC6aad2pLaq3nPuhojrFT2b6Usv64p97b-DCRCU 

Отклик успеха и входа в систему продолжается.

Токен, похоже, вводится только после обновления.

My AUTH0 Config является:

authProvider.init({ 
     domain: A0_DOMAIN, 
     clientID: A0_CLIENT, 
     callbackUrl: location.href, 
     loginState: 'out.login', 
     options:options 
    }); 



    var refreshingToken = null; 
    jwtInterceptorProvider.tokenGetter = function(store, jwtHelper) { 
     var token = store.get('token'); 
     var refreshToken = store.get('refreshToken'); 
     if (token) { 
      if (!jwtHelper.isTokenExpired(token)) { 
       return store.get('token'); 
      } else { 
       if (refreshingToken === null) { 
        refreshingToken = auth.refreshIdToken(refreshToken) 
         .then(function(idToken) { 
          store.set('token', idToken); 
          return idToken; 
         }) 
         .finally(function() { 
          refreshingToken = null; 
         }); 
       } 
      } 
     } 

    }; 

    jwtOptionsProvider.config({ 
     whiteListedDomains: ['localhost','https://www.ymtechno.com','https://www.ymtechno.com/_api','https://ymtechno.com/_api'] 
    }); 

    $httpProvider.interceptors.push('jwtInterceptor'); 

}) 
.run(function($rootScope, auth, store, jwtHelper, $location) { 
    var refreshingToken = null; 
    $rootScope.$on('$locationChangeStart', 
     function() { 
      var token = store.get('token'); 
      var refreshToken = store.get('refreshToken'); 
      if (token) { 
       if (!jwtHelper.isTokenExpired(token)) { 
        auth.authenticate(store.get('profile'), token); 
       } else { 
        if (refreshingToken === null) { 
         refreshingToken = auth.refreshIdToken(refreshToken) 
          .then(function(idToken) { 
           store.set('token', idToken); 
           return idToken; 
          }) 
          .finally(function() { 
           refreshingToken = null; 
          }); 
         return refreshingToken; 
        } else { 
         $location.path('login'); 
        } 
       } 
      } 

     }); 

    auth.hookEvents(); 
+0

Я не программирую '.net', но то, что выделялось для меня, состояло в том, что у вас есть' [AcceptVerbs («OPTIONS»)] ', но ваш' EnableCors' говорит, чтобы разрешить '*' методы. Кажется, что ваша веб-инфраструктура переопределяет заголовки, которые вы пытаетесь добавить вручную. Вы должны позволить вашей структуре определять эти заголовки. Проверьте свои аннотации. – Rafael

+0

Я думал, что это правильно, но после очистки кеша я снова получаю ту же ошибку. Как только я получу первую ошибку, я могу войти в систему без проблем. –

+0

удалите это '[AcceptVerbs (" OPTIONS ")]' – Rafael

ответ

1

После исследования я обнаружил, что перехватчик не надевал маркер в заголовок Идент, пока приложение не был перезапущен. Это было прочитано как ошибка CORS, потому что запрос не отвечал критериям доступа к API. Значение токена не определено.

Более в глубине резьбы о инжекторах и заголовках можно найти здесь:

Set HTTP header for one request

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

Смежные вопросы