2

IdentityServer 3では、通知で「SecurityTokenValidated」というイベントを使用して、自分のIDと名前とクレームを作成しました。例えば、私はこのようなリソースの所有者のワークフローと後でアクセスN APIにaccess_tokenを記憶:ASP.NETの通知IdentityServer v4のコアクライアント

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
{ 
AuthenticationType = "oidc", 

// ... 

Notifications = new OpenIdConnectAuthenticationNotifications 
{ 
    SecurityTokenValidated = async n => 
    { 
     var nid = new ClaimsIdentity(
      n.AuthenticationTicket.Identity.AuthenticationType, 
      "name", 
      ClaimTypes.Role); 
     nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 
     nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken)); 
     nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString())); 
    } 
} 
} 

IdentityServer 4でASP.NETコアの通知プロパティはありません。 私は主張の多くが自動的に生成されたが、そこに私はaccess_tokenも自動的に設定されているアイデンティティのユーザ名を取得しないことがわかります

ASP.NETコアで、クライアントの私の現在の構成は、この

のように見えます
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
     { 
      AuthenticationScheme = "oidc", 
      SignInScheme = "Cookies", 
      Authority = identityServerUri, 
      RequireHttpsMetadata = false, 
      ClientId = clientId, 
      ResponseType = "id_token token", 
      Scope = 
      { 
       "openid profile email warehouseapi" 
      }, 
      GetClaimsFromUserInfoEndpoint = true, 
      SaveTokens = true, 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
     }); 

これを行うためにIdentityServer 4が意図する方法は何ですか?

答えて

2

あなたは、特許請求の範囲を変換するためにTickedReceivedイベントを使用することができます。

 var oidcOptions = new OpenIdConnectOptions 
     { 
      ... 
      Events = new OpenIdConnectEvents() 
      { 
       // get access token 
       OnTicketReceived = ctx => 
       { 
        // transform claims 
        var access_token = ctx.Ticket.Properties.GetTokenValue("access_token"); 
        return Task.FromResult(0); 
       } 
      } 
     }; 

あなたがtrueにSaveTokensを設定すると、トークンは自動的に認証プロパティに保存されているので、また、あなたは、クレームとしてトークンを保存する必要はありません。トークンを取得するにはHttpContext.Authentication.GetTokenAsync("<token name>")を使用できます。

+0

thxイベントは機能しますが、私のaspコアプロジェクトには、GetTokenAsyncメソッド広告HttpContext.Authenticationはありません。 –

+0

を使用して 'Microsoft.AspNetCore.Authentication'を追加してみてください。 –

+0

トークンを取得したいですか? 'TickedReceived'イベントの場合、このようにしてトークンを取得することはできません。この場合、' var token = ctx.Ticket.Properties.GetTokenValue( "access_token"); 'を使うことができます。 –

2

これは実際にIdentityServer4とは関係ありません。これは、OWINとAspNetCoreの2種類の認証ミドルウェアの違いです。

これらの通知は現在、より正確には、使用して類似した何かを行うことができますEvents

を命名されています

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    AuthenticationScheme = "oidc", 
    SignInScheme = "Cookies", 

    Authority = "https://demo.identityserver.io", 
    PostLogoutRedirectUri = "http://localhost:3308/", 
    ClientId = "hybrid", 
    ClientSecret = "secret", 
    ResponseType = "code id_token", 
    GetClaimsFromUserInfoEndpoint = true, 
    SaveTokens = true, 

    Events = new OpenIdConnectEvents 
    { 
     OnTokenValidated = async n => 
     { 

     } 
    } 
}); 

をあなたはすべての素敵なイベントhereを見つけることができます。

関連する問題