2017-05-19 5 views
13

Ich habe an der Migration einer monolithischen ASP Core MVC-Anwendung gearbeitet, um einen Dienstarchitekturentwurf zu verwenden. Die MVC-Front-End-Website verwendet eine HttpClient, um die erforderlichen Daten von der ASP Core Web API zu laden. Ein kleiner Teil der Front-End-MVC-App erfordert auch eine Authentifizierung, die mithilfe von IdentityServer4 (integriert mit der Back-End-API) erfolgt. Das alles funktioniert gut, bis ich ein Authorize Attribut auf einen Controller oder eine Methode auf der Web-API legte. Ich weiß, dass ich irgendwie die Benutzerautorisierung vom Front-End zum Back-End weitergeben muss, damit das funktioniert, aber ich bin mir nicht sicher, wie. Ich habe versucht, die access_token: User.FindFirst("access_token"), aber es gibt null zurück. Ich habe dann versucht diese Methode, und ich bin in der Lage das Token zu erhalten:Pass-Through-Authentifizierung mit ASP Core MVC, Web API und IdentityServer4?

var client = new HttpClient("url.com"); 
var token = HttpContext.Authentication.GetTokenAsync("access_token")?.Result; 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

Diese Methode wird das Token, aber immer noch nicht mit dem Back-End-API ist die Authentifizierung. Ich bin ziemlich neu in diesem OpenId/IdentityServer-Konzept und jede Hilfe wäre willkommen!

Hier ist der entsprechende Code aus der MVC-Client-Startklasse:

private void ConfigureAuthentication(IApplicationBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "Cookies", 
      AutomaticAuthenticate = true, 
      ExpireTimeSpan = TimeSpan.FromMinutes(60) 
     }); 
     JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 
     app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
     { 
      AuthenticationScheme = "oidc", 
      SignInScheme = "Cookies", 

      Authority = "https://localhost:44348/", 
      RequireHttpsMetadata = false, 

      ClientId = "clientid", 
      ClientSecret = "secret", 

      ResponseType = "code id_token", 
      Scope = { "openid", "profile" }, 
      GetClaimsFromUserInfoEndpoint = true, 
      AutomaticChallenge = true, // Required to 302 redirect to login 
      SaveTokens = true, 

      TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
      { 
       NameClaimType = "Name", 
       RoleClaimType = "Role", 
       SaveSigninToken = true 
      }, 


     }); 
    } 

und die StartUp-Klasse der API:

 // Add authentication 
     services.AddIdentity<ExtranetUser, IdentityRole>(options => 
     { 
      // Password settings 
      options.Password.RequireDigit = true; 
      options.Password.RequiredLength = 8; 
      options.Password.RequireNonAlphanumeric = true; 
      options.Password.RequireUppercase = true; 
      options.Password.RequireLowercase = true; 

      // Lockout settings 
      options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); 
      options.Lockout.MaxFailedAccessAttempts = 10; 

      // User settings 
      options.User.RequireUniqueEmail = true; 
     }) 
      .AddDefaultTokenProviders(); 
     services.AddScoped<IUserStore<ExtranetUser>, ExtranetUserStore>(); 
     services.AddScoped<IRoleStore<IdentityRole>, ExtranetRoleStore>(); 
     services.AddSingleton<IAuthorizationHandler, AllRolesRequirement.Handler>(); 
     services.AddSingleton<IAuthorizationHandler, OneRoleRequirement.Handler>(); 
     services.AddSingleton<IAuthorizationHandler, EditQuestionAuthorizationHandler>(); 
     services.AddSingleton<IAuthorizationHandler, EditExamAuthorizationHandler>(); 
     services.AddAuthorization(options => 
     { 
      /* ... etc .... */ 
     }); 
     var serviceProvider = services.BuildServiceProvider(); 
     var serviceSettings = serviceProvider.GetService<IOptions<ServiceSettings>>().Value; 
     services.AddIdentityServer() // Configures OAuth/IdentityServer framework 
      .AddInMemoryIdentityResources(IdentityServerConfig.GetIdentityResources()) 
      .AddInMemoryClients(IdentityServerConfig.GetClients(serviceSettings)) 
      .AddAspNetIdentity<ExtranetUser>() 
      .AddTemporarySigningCredential(); // ToDo: Add permanent SigningCredential for IdentityServer 

Antwort

2

Added die nuget package here und der folgenden Code zu beheben:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "https://localhost:44348/", 
    ApiName = "api" 
}); 

Dadurch kann die API IdentityServer4 hosten und sich selbst als authen verwenden tikierung. Dann kann im MvcClient das Bearer-Token an die API übergeben werden.

0

Ja, Sie müssen das IdentityServer4.AccessTokenValidation-Paket zu Ihrem API-Projekt hinzufügen. Und überprüfen Sie die Kommentare unten

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "https://localhost:44348/", //Identity server host uri 
    ApiName = "api", // Valid Api resource name 
    AllowedScopes = scopes // scopes:List<string> 
}); 

sollten Sie entfernen den Code unten aus der StartUp-Klasse der API und ersetzen mit dem oben ein:

services.AddIdentityServer() // Configures OAuth/IdentityServer framework 
      .AddInMemoryIdentityResources(IdentityServerConfig.GetIdentityResources()) 
      .AddInMemoryClients(IdentityServerConfig.GetClients(serviceSettings)) 
      .AddAspNetIdentity<ExtranetUser>() 
      .AddTemporarySigningCredential(); 

der obige Code wird benötigt, auf dem Identity Server nicht auf der API oder einem anderen Client