2016-12-13 17 views
0

Microsoft Graphの認証トークンをリフレッシュする方法Microsoft Graph .NET Client Libraryを使用するか、C#を使用していますか?私は現在やっている何をC#を使用してMS Graphの認証トークンを更新する

は静的クラスでトークンを保っている。

public class TokenKeeper 
{ 
    public static string token = null; 
    public static string AcquireToken() 
    { 
     if (token == null || token.IsEmpty()) 
     { 
      throw new Exception("Authorization Required."); 
     } 
     return token; 
    } 
    public static void Clear() 
    { 
     token = null; 
    } 
} 

私はスタートアップクラスのトークンを埋める:

public partial class Startup 
{ 
    private static string AppKey = CloudConfigurationManager.GetSetting("ida:Password"); 
    private static string aadInstance = CloudConfigurationManager.GetSetting("ida:AADInstance"); 
    private static string TenantName = CloudConfigurationManager.GetSetting("ida:Tenant"); 
    private static string Authority = String.Format(CultureInfo.InvariantCulture, aadInstance, TenantName); 
    private static string graphResourceId = CloudConfigurationManager.GetSetting("ida:GraphUrl"); 
    private BpContext db = new BpContext(); 

    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     string ClientId = CloudConfigurationManager.GetSetting("ida:ClientID"); 
     string Authority = "https://login.microsoftonline.com/common/"; 

     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = ClientId, 
       Authority = Authority, 
       Scope = "User.ReadBasic.All", 
       //Details omitted 
        AuthorizationCodeReceived = (context) => 
        { 
         var code = context.Code; 
         // Create a Client Credential Using an Application Key 
         ClientCredential credential = new ClientCredential(ClientId, AppKey); 
         string userObjectID = context.AuthenticationTicket.Identity.FindFirst(
          "http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 
         AuthenticationContext authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectID)); 
         AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
          code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);      
         TokenKeeper.token = result.AccessToken; 

         return Task.FromResult(0); 
        } 
        //Details omitted 
       } 
      }); 
    } 
} 

私もログインアウトにトークンをクリア。

答えて

0

AuthenticationResultオブジェクトには、アクセストークンとリフレッシュトークンの両方が含まれています。したがって、リフレッシュトークンは、アクセストークンと同様にTokenKeeperに永続化することもできます。アクセストークンが期限切れになると(AuthenticationResult.ExpiresOnで示されます)、AuthenticationContext.AcquireTokenByRefreshTokenメソッドでリフレッシュトークンを使用して新しいアクセストークンを取得します。

リフレッシュトークンを明示的にトラッキングしたくない場合は、ADAL Cacheを参照して、ADALライブラリがどのように機能するのかをご確認ください。

+0

AcquireSilentAccessTokenと共にAcquireTokenByRefreshTokenが機能しません。私は両方の例外を取得します。最初の場合:例外はユーザーが不明であることを示しています(アクセストークンとリフレッシュトークンがキャッシュされ、修正され、検証されました)。後者はAdalAuthenticationReqiredExceptionをスローします。 –

0

AccessTokenと一緒に受け取ったRefreshTokenを提供すると、アクセストークンを更新できます。あなたのコードにID /シークレットがあるので、それらを使ってClientCredentialを提供することができます。 コード例は次のようになります。

var authContext = new AuthenticationContext( "https://login.microsoftonline.com/common");
var result = authContext.AcquireTokenByRefreshToken(refreshToken、new ClientCredential(ClientId、AppKey));

+0

私はそれを試して、MS Graphからユーザーが不明であると言うServiceExceptionを取得します。 –

関連する問題