Интеграция oidc Angular7 с Identityserver4

У меня есть приложение angular7 с ядром asp.net 2.2 и сервером идентификации 4 для аутентификации и авторизации. Я пытаюсь сделать гибридный или неявный тип гранта для аутентификации нашего углового приложения. Ядро Asp.net загружает наше приложение angular7, используя приведенный ниже код в startup.cs.

app.UseSpa(spa =>
        {                
            spa.Options.SourcePath = "ClientApp";

            if (env.IsDevelopment())
            {
                spa.UseAngularCliServer(npmScript: "start");
            }
      });

Я хочу, чтобы пользователь перенаправлялся на сервер идентификации для аутентификации, и после аутентификации наше угловое приложение должно открыться. Для этого я добавил ниже код в startup.cs

public void ConfigureServices(IServiceCollection services)
{
   services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies";
        options.Authority = "https://localhost:9001";
        options.RequireHttpsMetadata = false;
        options.ClientId = "AngularWebApp";
        options.ClientSecret = "the_secret";
        options.ResponseType = "code id_token";
        options.GetClaimsFromUserInfoEndpoint = true;
        options.SaveTokens = true;               
        options.Scope.Add("openApiScope");
        options.Scope.Add("offline_access");
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseAuthentication();   
}

Но этот код не перенаправляется автоматически, так как у меня нет какого-либо контроллера и метода действия, определенного в ядре asp.net, которое использует [Authorize]

Итак, что я пытался перенаправить автоматически, я написал код в классе AppModule Angular, чтобы проверить статус входа пользователя, если он не вошел в систему, а затем перенаправить пользователя на сервер идентификации, используя приведенный ниже код, используя oidc.client.js.

@NgModule({
    declarations: [
        AppComponent,

    ],
    imports: [
        BrowserModule,
        HttpClientModule,

    ],
    providers: [

    ],
    bootstrap: [AppComponent]
})
export class AppModule {
    constructor(private _authService: AppAuthNService) {
        from(this._authService._userManager.getUser().then((user) => {           
            if (user==null) {
                this._authService.login();
            } 
        }));
    } 
}

Теперь он перенаправляется на сервер авторизации, но я не уверен, что это хороший подход.

Может ли кто-нибудь предложить нам


person Rohit Kumar    schedule 04.07.2019    source источник
comment
Это выглядит хорошо, но зачем вам пользовательский контекст, если у вас нет защищенных конечных точек.   -  person Vidmantas Blazevicius    schedule 04.07.2019
comment
Спасибо, Видмантас, за ваш ответ. На самом деле я хотел защитить все статические ресурсы, такие как Js, изображения и т. Д., Которые будет использовать angular, не должны быть доступны без аутентификации. В этом случае angular загрузит свой файл начальной загрузки, по крайней мере, перед перенаправлением на Identityserver.   -  person Rohit Kumar    schedule 05.07.2019
comment
Такой защиты не будет. Все файлы angular будут обслуживаться при загрузке страницы (без аутентификации пользователя). Все файлы изображений по-прежнему будут доступны через обычный URL-адрес (без чего-либо лишнего), так что в основном это будет просто мираж защиты.   -  person Vidmantas Blazevicius    schedule 05.07.2019
comment
Это должно вам помочь: stackoverflow.com/a/50719550/2521893   -  person Fredrik Lundin    schedule 05.07.2019