Я знаю, что это старый вопрос, и я прочитал много статей об этом и, наконец, достиг этого. Каждая вещь работает отлично без аутентификации (без [System.Web.Mvc.Authorize]):Междоменная аутентификация веб-API
Контроллер апи:
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; } } }
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 не имеет никакой информации имя пользователя/пароль, как это может работать?
Спасибо заранее, и любые комментарии будут приветствоваться.
Спасибо за ваш ответ. Поскольку я сейчас не работаю над этим тестированием, я дам свои отзывы о том, что произойдет позже :) – cheny