Почему во время аутентификации происходит сбой вызова API-токена в конкретной среде? (Ошибка 400) - PullRequest
0 голосов
/ 24 мая 2019

История вопроса / проблема : я запускаю приложение Angular (с C # /. NET WebApi / DataAccess) и получаю следующие ошибки при попытке входа в систему (происходит в среде DEV, а не в REL):

Ошибки консоли Chrome Dev Tools:

  • POST http://localhost:1789/api/token 400 (неверный запрос)
  • Внутренний код вернул 400, тело было [объект объекта]

Ошибка происходит только в DEV.Не бывает в REL или PROD.Это работало в DEV ранее.

То, что я до сих пор пробовал :

  1. Я могу делать вызовы других классов и методов в WebApi, но не уверенОткуда появилась эта ошибка.

  2. Я не вижу никакой дополнительной информации на вкладке "Сеть" в Chrome Dev Tools (просто снова упоминается код состояния)

  3. Я использовал отладчик на вкладке «Источники» инструментов разработчика Chrome, а также не увидел никакой дополнительной информации

  4. В коде C # не было никаких измененийчто я могу видеть из системы контроля версий.Угловой компонент и сервис одинаковы.

  5. Я протестировал другие части API, как указано выше

  6. Я проверил мойКонфигурационные файлы несколько раз, и они, кажется, имеют соответствующие значения, которые у них были

  7. Я просмотрел информацию об авторизации токена, такую ​​как: https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server Spotify APIневерный запрос на авторизацию api / token Ошибка: 400 (а также все другие статьи SO, посвященные 400 ошибкам для api token, которые я смог найти)

  8. Отладка в Visual Studio: дляOAuthAuthorizationServerOptions: AccessTokenFormat равно нулю. AuthorizeEndpointPath равно {}.Но TokenEndpointPath равен {/ api / token}

Код :

login.component.ts :

cmdLogin_click()
{
    if (this._authForm.value.username != null && this._authForm.value.password != "")
    {
        if (this._authForm.valid)
        {
            this.securityService.loginEndpoint(this._authForm.value.username,this._authForm.value.password)
            .subscribe(response => {

                this.setUser(response);

                this.routerService.navigate(['/home']);
            },
        }
    }
}

security.service.ts :

public loginEndpoint(email: string, password: string): Observable<any> {
    let url = API_URL + '/api/token';
    let ip = "";
    const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8');
    let content: string = "grant_type=password&username=" + email + "&password=" + password + "&ip=" + ip
    return this.http.post(url, content, { headers: headers }).pipe(
        catchError(this.handleError)
    )
}

private handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
        // A client-side or network error occurred. Handle it accordingly.
        console.error('An error occurred:', error.error.message);
    } else {
        // The backend returned an unsuccessful response code. // The response body may contain clues as to what went wrong,
        console.error(
            `Backend returned code ${error.status}, ` +
            `body was: ${error.error}`);
    }
    // return an observable with a user-facing error message
    return throwError(
        'Something bad happened; please try again later.');
};  

Startup.cs :

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
}

Startup.Auth.cs :

public void ConfigureAuth(IAppBuilder app)
{
    // Configure the db context and user manager to use a single instance per request
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);


    // Configure the application for OAuth based flow
    PublicClientId = "self";
    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/api/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(25),
        Provider = new EmdOAuthProvider(),
        RefreshTokenProvider = new SimpleRefreshTokenProvider()
    };


    // Enable the application to use bearer tokens to authenticate users
    app.UseOAuthBearerTokens(OAuthOptions);
}

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

Застрял в этом в течение нескольких часов.Где я должен сосредоточиться в этой точке?

...