Проблемы .NET Core 2 WebAPI CORS с Angular 4 и Windows Auth - PullRequest
0 голосов
/ 27 августа 2018

Да, у меня есть бесчисленное множество статей и перестановка добавить приложение. UserCors и другие советы, но я все еще застрял.

Использование Visual Studio WebAPI Core 2 с веб-интерфейсом Angular 2.

Использование проверки подлинности Windows на удаленном сервере с использованием IIS 8.5 (на самом деле это также не работает локально).

Config запуска WebAPI:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<SomeContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SomeDB")));

    //////// ********************
    //////// Setup CORS
    //////// ********************
    var corsBuilder = new CorsPolicyBuilder();
    corsBuilder.AllowAnyHeader();
    corsBuilder.AllowAnyMethod();
    corsBuilder.WithOrigins("*"); 
    corsBuilder.AllowCredentials();

    services.AddCors(options =>
    {
        options.AddPolicy("AllowAll", corsBuilder.Build());
    });

    services.AddMvc();

...


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("AllowAll"); //<===            

    app.UseMvc();

...

Когда я запускаю WebAPI локально или развертываю его на удаленном сервере, интерфейс My Angular 4 дает мне:

Для вызова на контроллер WebAPI - 401 (неавторизовано) (даже на контроллерах, для которых не установлен [Authorize()].

Когда я пытаюсь использовать свой локальный экземпляр приложения Angular для доступа к удаленному WebAPI:

На запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Origin 'http://localhost:62482' поэтому не допускается. Ответ имеет HTTP-код состояния 401.

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

Я вручную добавил заголовки респона в IIS8.5 (они перезаписываются при каждом развертывании нового кода).

Я полностью удалил все содержимое CORS из приложения WebAPI.

I SWEAR все это работало одновременно. Не уверен, что изменилось.

У меня все работает нормально, когда я развертываю и приложение WebAPI Core 2, и веб-приложение Angular на удаленном сервере, потому что источники одинаковы, но это делает невозможной локальную отладку.

*** Код углового РЕПО под запрос:

import { Injectable, Inject } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { DocumentModel } from '../models/document.model';
import 'rxjs/add/observable/from';
import 'rxjs/add/operator/map';
import { map } from 'rxjs/operators/map';
import { IRepository } from './IRepository';
declare var API_URL: string;

@Injectable()
export class DocumentRepository implements IRepository<DocumentModel, number> {
    GetByDocument(key: any): Observable<DocumentModel[]> {
        throw new Error("Method not implemented.");
    }
    private httpService: Http;
    private apiRootUrl: string;

    constructor(http: Http) {
        this.httpService = http;
        this.apiRootUrl = API_URL;
    }

    Create(Model: DocumentModel): Observable<any> {
        throw new Error("Method not implemented.");
    }

    Find(key: any): Observable<DocumentModel[]> {
        return this.httpService.get(this.apiRootUrl +'documents/mine').map(result => result.json());
    }

    Get(id: any): Observable<DocumentModel> {
        return this.httpService.get(this.apiRootUrl +'documents/' + id).map(result => result.json());
    }
}

1 Ответ

0 голосов
/ 27 августа 2018

Это работает для меня: В Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseAuthentication();

        //app.UseHttpsRedirection();
        app.UseCors(
            options => options.AllowAnyOrigin().AllowAnyHeader()
                                               .AllowAnyMethod()
                                               .AllowCredentials()
        );
        app.UseMvc();
    }

и это все, никаких других упоминаний о Корсе.

Я использую токен на предъявителя JWT, и [Authorize] работает как положено.

Сначала вы можете попробовать с Почтальоном, просто посмотреть, работает ли ваша конечная точка, а затем перейти к созданию Angular http.get ()

Это угловая часть

const headers = new HttpHeaders().
                    set('Accept', 'application/json')

const url = 'http://localhost:5000/api/'  

return this.http.get(
   url + 'endpoint',
   { headers: headers }
);  
...