2014-01-29 4 views
-1

Я знаю, что это старый вопрос, и я прочитал много статей об этом и, наконец, достиг этого. Каждая вещь работает отлично без аутентификации (без [System.Web.Mvc.Authorize]):Междоменная аутентификация веб-API

  1. Контроллер апи:

    using System.Web.Http; 
    using System.Web.Mvc; 
    
    namespace WebApi.Controllers 
    { 
        [System.Web.Mvc.Authorize] 
        public class ProductsController : ApiController 
        { 
         public IEnumerable<string> GetAllNames() 
         { 
          return new List<string> {"abc", "def", User.Identity.Name}; 
         } 
    
         public string GetName(string name) 
         { 
          return name; 
         } 
        } 
    } 
    
  2. Web.Config Четыре линии под добавляются поддерживать CORS.

    <system.webServer> 
        <validation validateIntegratedModeConfiguration="false" /> 
        <modules> 
         <remove name="WebDAVModule"/><!-- ADD THIS to enable POST/DELETE --> 
        </modules> 
        <handlers> 
         <remove name="WebDAV" /><!-- ADD THIS to enable POST/DELETE --> 
         <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
         <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
         <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
         <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
         <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
         <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
        </handlers> 
        <httpProtocol> 
         <customHeaders> 
         <clear /> 
         <!-- Adding the following custom HttpHeaders will help prevent CORS from stopping the Request--> 
         <add name="Access-Control-Allow-Origin" value="*" /> 
         <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
         </customHeaders> 
        </httpProtocol> 
        </system.webServer> 
    

Но когда [Авторизоваться] добавляется к контроллеру апи, все идет не так.

Вот ссылка на страницу api, есть до 7 решений, которые я читал из Интернета, был бы учебником, если бы кто-нибудь из них работал. Многие говорили, что «это работает для меня», но для меня нет.

Я прокомментировал все решения под заголовком и записал возникшую ошибку.

 var host = 'http://localhost:54364/api/products/'; 
     userName = "[email protected]"; 
     password = "password"; 
     $(document).ready(function() { 
      //Solution 1: OPTIONS http://localhost:54364/api/products/GetAllNames?name=someone 405 (Method Not Allowed)/http://localhost:54364/api/products/GetAllNames?name=someone. Invalid HTTP status code 405 
      //$.ajaxSetup({ 
      // headers: { 
      //  'Authorization': "Basic " + btoa("[email protected]" + ":" + "nodenode") 
      // } 
      //}); 
      $.ajax({ 
       type: "GET", 
       url: host + "GetAllNames", 
       dataType: 'json', 
       //Solution 2: Ok, but User.Identity.UserName returns "", an empty string; I think it does not work at all. 
       //username: userName, 
       //password: password, 
       async: false, 
       //Solution 3: GET http://localhost:54364/api/products/GetAllNames?name=someone 405 (Method Not Allowed)/OPTIONS http://localhost:54364/api/products/GetAllNames?name=someone 405 (Method Not Allowed)/XMLHttpRequest cannot load http://localhost:54364/api/products/GetAllNames?name=someone. Invalid HTTP status code 405 
       //headers: { "Authorization": btoa("Basic " + userName + ":" + password) }, 
       //Solution 4: XMLHttpRequest cannot load http://localhost:54364/api/products/GetAllNames. Wildcards cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:64710' is therefore not allowed access. 
       //xhrFields: { 
       // withCredentials: true 
       //}, 
       beforeSend: function (xhr) { 
        //Solution 5: Same with solution 2. 
        //xhr.withCredentials = true; 
        //Solution 6: OPTIONS http://localhost:54364/api/products/GetAllNames?name=someone 405 (Method Not Allowed)/OPTIONS http://localhost:54364/api/products/GetAllNames?name=someone 405 (Method Not Allowed)/XMLHttpRequest cannot load http://localhost:54364/api/products/GetAllNames?name=someone. Invalid HTTP status code 405 
        //xhr.setRequestHeader("Authorization", "Basic " + btoa(userName + ":" + password)); 
        //Solution 7 (5 + 6): same with solution 6. 
       }, 
       crossDomain: true, 
       success: 
        function(data) { 
         // On success, 'data' contains a list of products. 
         $.each(data, function(key, item) { 
          // Add a list item for the product. 
          $('<li>', { text: formatItem(item) }).appendTo($('#ajax')); 
         }); 
        } 
      }); 

Будучи новым с помощью AJAX и Web API (всего 2 дня опыта), я думаю, я мог бы что-то пропустил, например, решение 4 не имеет никакой информации имя пользователя/пароль, как это может работать?

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

ответ

0

Проблема заключается в Access-Control-Allow-Origin заголовке вашего ответа. Если вы используете аутентификацию, вы не можете использовать подстановочный код *. Вам нужно явно указать домен.

И если вы хотите использовать withCredentials: true то ваш сервер должен установить дополнительный заголовок Access-Control-Allow-Credentials как true

Access-Control-Allow-Credentials: true 
+0

Спасибо за ваш ответ. Поскольку я сейчас не работаю над этим тестированием, я дам свои отзывы о том, что произойдет позже :) – cheny

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