Оператор == проверяет, имеют ли две переменные одинаковые ссылки (aka указатель на адрес памяти).
blockquote>String foo = new String("abc"); String bar = new String("abc"); if(foo==bar) // False (The objects are not the same) bar = foo; if(foo==bar) // True (Now the objects are the same)
В то время как метод equals () проверяет, ссылаются ли две переменные на объекты, имеющие одно и то же состояние (значения).
blockquote>String foo = new String("abc"); String bar = new String("abc"); if(foo.equals(bar)) // True (The objects are identical but not same)
Приветствия: -)
От MS:
Если вы отключите анонимную аутентификацию, то по дизайну IIS вернет 401 для любого запроса. Если они включили аутентификацию Windows, ответ 401 в этом случае будет иметь заголовок WWW-Authenticate, чтобы клиент мог начать аутентификацию. Затем возникает вопрос, может ли клиент, используемый клиентом, выполнить проверку подлинности Windows или нет.
Наконец, кажется, что может возникнуть основной вопрос о том, возможно ли или нет настроить URL-адрес таким образом, чтобы анонимный доступ допускается для одного глагола (в этом случае ОПЦИИ), но для проверки подлинности для других глаголов требуется проверка подлинности Windows. IIS не поддерживает это через простую конфигурацию. Возможно, это можно будет получить, включив анонимную проверку подлинности Windows и Windows, установив списки ACL в содержимом, запрещающем доступ к анонимному пользователю, а затем настройте отображение обработчика для рассматриваемого URL-адреса, чтобы он не проверял существование файл, связанный с URL-адресом. Но для этого нужно немного поиграть.
Я использую Web API и OWIN, и я пробовал каждое предлагаемое решение, но единственное, что сработало, было следующее
//use it in your startup class
app.Use((context, next) =>
{
if (context.Request.Headers.Any(k => k.Key.Contains("Origin")) && context.Request.Method == "OPTIONS")
{
context.Response.StatusCode = 200;
context.Response.Headers.Add("Access-Control-Allow-Origin", new string[1] { "ALLOWED_ORIGIN" });
context.Response.Headers.Add("Access-Control-Allow-Headers", new string[4] { "Origin", "X-Requested-With", "Content-Type", "Accept" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new string[5] { "GET", "POST", "PUT", "DELETE", "OPTIONS" });
context.Response.Headers.Add("Access-Control-Allow-Credentials", new string[1] { "true" });
return context.Response.WriteAsync("");
}
return next.Invoke();
});
//this is important! Without it, it didn't work (probably because the middleware was too late)
app.UseStageMarker(PipelineStage.Authenticate);
, вам нужно вставить этот код где-нибудь в один из ваших классов запуска OWIN , Очень важно называть app.UseStageMarker(PipelineStage.Authenticate)
, потому что в противном случае проверка предполета закончилась неудачно. Дополнительная информация для UseStageMarker -> https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
Также важно, чтобы вам нужно было явно определять разрешенные заголовки. Он будет терпеть неудачу, если вы используете *
в качестве заполнителя.
Возможно, это помогает кому-то.
Сегодня я столкнулся с такой же проблемой из-за ошибки в IE 10 и 11 , я использую ServiceStack вместо WebApi, но этот подход может работать и на вас.
После прохождения через все фильтры он выполняет службу.
В моей AppHost,
appHost.Plugins.Add(new CorsFeature());
appHost.RequestFilters.Add(AuthenticateFilter.Authenticate);
Я изменил CorsFeature для обработки OptionsRequest в дополнение к добавлению заголовков, Authenticate Filter для проверки подлинности запросов!
Вы можете разрешить только глагол OPTIONS для анонимных пользователей.
<system.web>
<authentication mode="Windows" />
<authorization>
<allow verbs="OPTIONS" users="*"/>
<deny users="?" />
</authorization>
</system.web>
Согласно спецификациям W3C браузер не включает учетные данные пользователя из предпрограммы CORS: https://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#preflight -request
Самый простой способ исправить это - создать правило перезаписи с условием request_method = ^ OPTIONS $. Затем установите действие как настраиваемый ответ, установите его на 200 OK. Затем все запросы параметров будут отвечать 200, а не 401. Это исправит проблему CORS.
Конечно, вам все равно нужно убедиться, что у вас есть правильные заголовки запросов на кросс-начало.
Это остановит запросы параметров (которые не имеют учетных данных), отвечающих 401, когда интегрированный auth включен.
Включение SupportCredentials в EnableCorsAttribute в WebApiConfig.cs сделал трюк для меня:
public static void Register(HttpConfiguration config)
{
//enable cors request just from localhost:15136
var cors = new EnableCorsAttribute("http://localhost:15136", "*", "*");
cors.SupportsCredentials = true;
config.EnableCors(cors);
//other stuff
}
https://www.asp.net/web-api/overview/security/enabling- cross-origin-requests-in-web-api
Убедитесь, что вы отправляете учетные данные при вызове из javascript ({withCredentials :true}
)
Принятый ответ правильный, однако я некоторое время устранял проблему rest api с установкой «узел с модулем iisnode и npm cors», и было неудобно просто включать анонимную аутентификацию для всех пользователей. Поскольку его узловое приложение тегом system.web мало что делает. Я получил следующее дополнение к web.config:
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
<authorization>
<add accessType="Allow" verbs="OPTIONS" users="?" />
<add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" />
</authorization>
</security>
</system.webServer>
Что работало для меня (при работе с AngularJS или JQuery), нужно добавить withCredentials: true для каждого запроса на клиенте:
$http.get("http://localhost:88/api/tests", {withCredentials :true})
И включение CORS на сервере, это было сделано с Microsoft.Owin .Cors from nuget и добавление его в Startup, как показано ниже:
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
Ссылки:
Несколько лет спустя, но через ответ от @dariusriggins и @ lex-li мне удалось добавить следующий код в мой Global.asax:
public void Application_BeginRequest(object sender, EventArgs e)
{
string httpOrigin = Request.Params["HTTP_ORIGIN"];
if (httpOrigin == null) httpOrigin = "*";
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin);
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 200;
var httpApplication = sender as HttpApplication;
httpApplication.CompleteRequest();
}
}
, что httpOrigin действительно просматривается в список разрешенных хостов, но это просто сложные вещи. Это означает, что все остальные запросы проверяются, но параметры просто возвращаются.
Спасибо за этот вопрос, я бы потерялся без него!
withCredentials
в HTTP-заголовок. Спасибо!
– Ben Cottrell
5 December 2016 в 14:51
HttpApplication.BeginRequest
, где этот модуль возвращает ожидаемый ответ 200 для запросов перед полетом. Это обходное решение применимо только к интегрированному режиму IIS 7+. К сожалению, поддержка Microsoft может не знать об этом совете. – Lex Li 11 January 2015 в 13:17