2016-09-26 3 views
4

匿名ユーザーが使用できるASP.NETコアMVCアプリケーションがあります。クライアント資格情報フローを使用してトークンを永続化するためのベストプラクティス

new Client 
{ 
    ClientId = "my-mvc-client-app", 
    AllowedGrantTypes = GrantTypes.ClientCredentials, 

    RequireConsent = false, 
    ClientSecrets = new List<Secret> { new Secret("this-is-my-secret".Sha256()) }, 
    AllowedScopes = new List<string> 
    { 
     StandardScopes.OpenId.Name, 
     StandardScopes.Profile.Name, 
     StandardScopes.OfflineAccess.Name, 
     "my-protected-api" 
    }, 
    RedirectUris = new List<string> 
    { 
     "http://localhost:5009/signin-oidc", 
    } 
} 
:このアプリは、私はMVCアプリケーション(クライアント)を記述するIdentity Serverのクライアントを作成し、それをこのようなAPIのスコープへのアクセス権を与えているアイデンティティ・サーバー4で保護されているASP.NETのWeb APIを呼び出しています私のMVCアプリで

、私はこのような保護されたAPIに要求を行うときに、私が使用できるトークンを取得するためにTokenClientを使用しています:

var disco = await DiscoveryClient.GetAsync("http://localhost:5010"); 
var tokenClient = new TokenClient(disco.TokenEndpoint, clientId, clientSecret); 
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("hrmts-test-candidate-api-scope"); 

これは正常に動作しますが、私は、Identity Serverから新しいトークンを要求していますおそらく良い考えではないでしょう。

トークンを処理するベストプラクティスは何ですか?どのようにクライアント(MVCアプリケーション)にそれらを保持することができますし、リフレッシュトークンを処理して、クライアントが必要なときに新しいトークンを取得できるようにするにはどうすればよいですか?

答えて

4

必要な場所で使用できるように、そのクライアントを(シングルトンとして)何らかの管理サービスにラップする必要があります。 - あなたは何とかそのトークンをキャッシュする必要が

public class ServerTokenComponent 
{ 
    private TokenResponse Token { get; set; } 
    private DateTime ExpiryTime { get; set; } 
    public async Task<TokenResponse> GetToken() 
    { 
     //use token if it exists and is still fresh 
     if (Token != null) 
     { 
      if (ExpiryTime > DateTime.UtcNow) 
      { 
       return Token; 
      } 
     }  

     //else get a new token 
     var client = new TokenClient("myidpauthority.com","theclientId","thesecret") 
     var scopes = "for bar baz"; 

     var tokenResponse = await client.RequestClientCredentialsAsync(scopes); 

     if (tokenResponse.IsError || tokenResponse.IsHttpError) 
     { 
      throw new SecurityTokenException($"Could not retrieve token."); 
     } 

     //set Token to the new token and set the expiry time to the new expiry time 
     Token = tokenResponse; 
     ExpiryTime = DateTime.UtcNow.AddSeconds(Token.ExpiresIn); 

     //return fresh token 
     return Token; 
    } 
} 
+0

私はアプローチが好きですが、これがシングルトンとしてスコープされている場合は、この実装スレッドは安全で安全です。 – LugTread

2

IOW:我々は、この流れを次のサーバーの通信にサーバーに使用するトークンのコンポーネントを持っています。トークンを要求すると、応答のExpiresInが取得されます。これにより、トークンが有効である期間が示されます。

もう1つの方法は、APIが401を返すまで待ってから新しいトークンを要求することです。

リフレッシュトークンは、クライアントの資格情報フローでは使用されません。

関連する問題