2016-12-13 8 views
0

Как обновить токен аутентификации для Microsoft Graph с использованием Microsoft Graph .NET Client Library или другого с использованием C#?Обновить токен аутентификации для MS Graph с C#

То, что я сейчас делаю держит маркер в статическом классе:

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

AcquireTokenByRefreshToken не работает, наряду с AcquireSilentAccessToken. Я получаю исключения для обоих. Для первого: исключение говорит, что пользователь неизвестен (токены доступа и токены обновления теперь кэшированы и корректны, я его проверил), а последний просто выбрасывает AdalAuthenticationReqiredException. –

0

Вы можете обновить токен доступа, предоставив RefreshToken, который вы получили вместе с AccessToken. Поскольку у вас есть ID/Secret, доступный в вашем коде, вы можете использовать их для предоставления ClientCredential. Пример кода:

var authContext = new AuthenticationContext ("https://login.microsoftonline.com/common");
var result = authContext.AcquireTokenByRefreshToken (refreshToken, новый ClientCredential (ClientId, AppKey));

+0

Я попробовал, я получаю ServiceException из MS Graph, который говорит, что пользователь неизвестен. –