Как предотвратить перенаправление браузера при проверке подлинности Windows на URL-адрес API?

У нас есть интерфейс Angular4, который вызывает веб-API ASP.NET Core 2.0, размещенный в IIS, с использованием проверки подлинности Windows. При загрузке внешнего интерфейса в первый раз или в режиме инкогнито требуется вход в систему, но после успешного входа в систему не выполняется перенаправление обратно на интерфейсную часть. Происходит это так:

  • Перейдите к интерфейсу на http://localhost:4200
  • Появится запрос на вход с URL-адресом API на http://localhost:53465.
  • После успешного входа в систему браузер остается на http://localhost:53465 вместо перенаправления на http://localhost:4200.

Все это началось недавно с последним обновлением Chrome, раньше это никогда не было проблемой; после входа в систему вы будете перенаправлены на интерфейс, к какой бы странице вы ни намеревались перейти.

Вот что у нас есть для web.config на интерфейсном сайте:

<?xml version = "1.0" encoding = "utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name = "Angular" stopProcessing = "true">
          <match url = ".*" />
          <conditions logicalGrouping = "MatchAll">
            <add input = "{REQUEST_FILENAME}" matchType = "IsFile" negate = "true" />
            <add input = "{REQUEST_FILENAME}" matchType = "IsDirectory" negate = "true" />
          </conditions>
          <action type = "Rewrite" url = "/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Вот файл web.config для сайта API:

<?xml version = "1.0" encoding = "utf-8"?>
<configuration>
  <appSettings>
    <add key = "autoFormsAuthentication" value = "false" />
    <add key = "enableSimpleMembership" value = "false" />
    <add key = "PreserveLoginUrl" value = "true" />
  </appSettings>
  <system.web>
    <authentication mode = "Windows" />
  </system.web>
  <system.webServer>
    <handlers>
      <remove name = "aspNetCore" />
      <add name = "aspNetCore" path = "*" verb = "*" modules = "AspNetCoreModule" resourceType = "Unspecified" />
    </handlers>
    <aspNetCore processPath = "%LAUNCHER_PATH%" arguments = "%LAUNCHER_ARGS%" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" startupTimeLimit = "3600" requestTimeout = "23:00:00" forwardWindowsAuthToken = "true" />
    <security>
      <authorization>
        <remove users = "*" roles = "" verbs = "" />
        <add accessType = "Allow" users = "?" verbs = "OPTIONS" />
        <add accessType = "Allow" roles = "USERS" />
      </authorization>
    </security>
  </system.webServer>
</configuration>

Вот как мы делаем наши HTTP-запросы в Angular:

getPendingRequests(owner: string): Observable<any[]> {
        let url = `${this.baseUrl}pending`;
        return this._http.get(url).map((res: Response) => res.json());
    }

и параметры, которые отправляются вместе с ним:

@Injectable()
export class NoCacheRequestOptions extends BaseRequestOptions {
    constructor () {
        super();
        this.headers.append('Cache-Control','no-cache');
        this.headers.append('Pragma', 'no-cache');
        this.headers.append('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT');
        this.headers.append('Content-Type', 'application/json');
        this.withCredentials = true;
      }
}

Вот пример конечной точки API:

[Route("pending")]
[Authorize]
public class PendingCorrespondenceController : Controller
{
    ....
    public async Task<IActionResult> GetPendingCorrespondence()
        {

И наш Startup.cs для API:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(Configuration);
            services.AddMemoryCache();
            services.AddMvc();
            services.AddAuthentication(IISDefaults.AuthenticationScheme);
            services.AddAuthentication("CookieAuthenticationScheme")
                .AddCookie("CookieAuthenticationScheme");
            services.AddCors(options =>
            {
                options.AddPolicy("AllowSpecificOrigin", builder =>
                {
                    builder.WithOrigins(Configuration["CORS:AllowedOrigins"]);
                    builder.AllowCredentials();
                    builder.AllowAnyHeader();
                    builder.AllowAnyMethod();
                });
            });

            services.AddSingleton<IDashboardData, CacheDashboardData>();
            services.AddSingleton<ICorrespondencePermission, CorrespondencePermission>();
            services.AddSingleton<IPendingCorrespondence, PendingCorrespondence.PendingCorrespondence>();
            services.AddSingleton<IHoldForReview, HoldForReview.HoldForReview>();
            services.AddSingleton<IActiveDirectory, ActiveDirectory>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
            app.UseAuthentication();
            app.UseCors("AllowSpecificOrigin");
            app.UseMiddleware<PermissionsMiddleware>();
            app.UseMiddleware<GlobalExceptionLogger>();
            app.UseMvc().UseMvcWithDefaultRoute();
        }

Мы боролись с этим в течение пары дней, но безуспешно, есть ли что-то очевидное, что нам не хватает?

У нас такая же проблема с AngularJS, вы нашли решение?

Devin Rodriguez 25.05.2018 19:45

К сожалению, мы не нашли решения, и нам пришлось прибегнуть к объединению API и UI на одном сервере / порту.

deadflowers 26.05.2018 23:50
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
2
431
0

Другие вопросы по теме