Существует много алгоритмов, в зависимости от того, что вы хотите. Обычно они требуют отслеживания частичных сумм. Если вы сохраните только суммы x [k + 1] - x [k], вы получите алгоритм Кахана. Если вы отследите все частичные суммы (следовательно, получив алгоритм O (n ^ 2)), вы получите ответ @dF.
Обратите внимание, что дополнительно к вашей проблеме суммирование чисел отличается Знаки очень проблематичны.
Теперь есть более простые рецепты, чем отслеживание всех частичных сумм:
Личный опыт показывает, что вам обычно не нужны более интересные вещи, чем метод Кахана.
Попробуйте установить options.AutomaticChallenge = true;
в настройках куки, и оно должно работать.
options.AutomaticAuthentication
был разделен на options.AutomaticAuthenticate
и options.AutomaticChallenge
. Если для последнего оставлено значение false
, возникает исключение, поскольку промежуточное программное обеспечение для аутентификации не обрабатывает вызов, примененный фильтром авторизации.
Надеюсь, это поможет кому-то еще, потому что я потратил много времени на устранение этой ошибки, хотя я установил AutomaticChallenge = true
.
Оказывается, вы получите ту же ошибку, если поставить app.UseIdentity();
после app.UseMvc(routes => ...)
. Теперь, когда я знаю ответ, это очевидно. Это потому, что все это промежуточное ПО происходит в том порядке, в котором вы его добавили.
Это приводит к ошибке « Нет обработчика аутентификации настроен »:
public void Configure(...)
{
app.UseMvc(routes => { routes.MapRoute(...) }; );
app.UseIdentity();
}
Это не вызывает ошибку:
public void Configure(...)
{
app.UseIdentity();
app.UseMvc(routes => { routes.MapRoute(...); });
}
Поместите это в метод Configure.
app.UseIdentity();
Проблема была решена для меня, убедившись, что схема куки была последовательно названа, где бы она ни использовалась. например :
public void ConfigureServices(IServiceCollection services)
{
// if using IdentityServer4
var builder = services.AddIdentityServer(options =>
{
options.AuthenticationOptions.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme;
...
})
services.AddIdentity<MyUser, IdentityRole>(options =>
{
options.Cookies.ApplicationCookie.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme;
...
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme,
AutomaticAuthenticate = false,
AutomaticChallenge = true
});
}
И при взаимодействии с промежуточным программным обеспечением аутентификации. например :
await HttpContext.Authentication.SignInAsync(Constants.DefaultCookieAuthenticationScheme, cp);
Если вы используете app.UseIdentity();
и некоторое другое промежуточное программное обеспечение для входа, такое как UseFacebookAuthentication
, убедитесь, что app.UseFacebookAuthentication()
- ПОСЛЕ app.UseIdentity();
.
В другой возможности отсутствует следующая настройка в Configure
app.UseCookieAuthentication();
. Хотя соблазнительно поместить большую часть наших настроек конфигурации в файл startup.cs
, кажется, что предпочтительный способ сделать это - установить параметры app.UseCookieAuthentication()
- sans - в файле startup.cs
, а затем поместить все «опции» и другие детали в отдельном файле.
Вроде как то, что мы делали с тем, как файл Global.asax
имел указатели на файлы папок App_Start
в Asp.Net vBefore.
Я страдал от подобной боли при попытке настроить EF / Sql в startup.cs
, и, переместив все «опции» за пределы startup.cs
, все работало намного лучше.
ТАКЖЕ: обратите внимание на комментарий Фреди Венгера к вашему вопросу, который указывает на «переименование» многих пространств имен от v -8beta до v -RC1-final.