2017-05-19 20 views
13

私はサービスアーキテクチャ設計を使用するために、モノリシックなASPコアMVCアプリケーションの移行に取り組んできました。 MVCフロントエンドWebサイトでは、HttpClientを使用して、ASPコアWeb APIから必要なデータを読み込みます。フロントエンドのMVCアプリケーションのほんの一部には、IdentityServer4(バックエンドAPIと統合されている)を使用して実装されている認証も必要です。これはすべて、私がAuthorize属性をWeb APIのコントローラまたはメソッドに追加するまで素晴らしいです。これを行うには、フロントエンドからバックエンドに何らかのユーザー権限を渡す必要があることはわかっていますが、どうすればよいか分かりません。私はaccess_token:User.FindFirst("access_token")を取得しようとしましたが、nullを返します。私は、この方法を試してみましたが、私は、トークンを取得することができています:ASPコアMVC、Web API、およびIdentityServer4による認証をパスしますか?

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

このメソッドは、トークンを取得しますが、それでもバックエンドのAPIを使用して認証しません。私はこのOpenId/IdentityServerの概念にかなり新しいですし、どんな助けも高く評価されます!

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 
      }, 


     }); 
    } 

とAPIの起動クラス:ここ

はMVCクライアントの起動クラスから関連するコードです

 // 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 

答えて

2

nuget package hereし、修正するために、次のコードを追加しました:

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

これにより、APIはIdentityServer4をホストし、自身をauthenとして使用できますtication。その後、MvcClientでベアラトークンをAPIに渡すことができます。

0

はい、IdentityServer4.AccessTokenValidationパッケージをAPIプロジェクトに追加する必要があります。そして、あなたはAPIのスタートアップクラスから以下のコードを削除し、上記 1で置き換える必要があり

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

以下のコメントをご確認ください:

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

上記のコードは、あなたに必要ですAPIまたは他のクライアントにないIdentity Server

関連する問題