是否可以从客户端撤消Azure AD ADAL(ios)刷新令牌?

时间:2015-10-29 02:44:00

标签: azure adal

我正在尝试在iOS应用中使用ADALiOS。我还希望有一个注销按钮,以便在需要时,用户可以选择从应用程序注销。我认为最好的方法是撤销刷新令牌(访问令牌是短暂的,并且不能被撤销),理想情况下,它也应该撤销令牌并在服务器端进行清理。 / p>

我尝试了Azure AD文档,在源代码中搜索(一般在其他地方搜索过),但在ADAL中找不到任何提醒刷新令牌的撤销。

可以在ADAL中撤消刷新令牌吗?记录用户的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

是。来自Best Practices for OAuth 2.0 in Azure AD

  

刷新令牌没有指定的生命周期。通常,   刷新令牌的生命周期相对较长。 然而,在一些   案例,刷新令牌过期,被撤销或缺乏足够的   所需行动的特权。客户端应用程序需要   期望并处理令牌颁发端点返回的错误   正确。当您收到带有刷新令牌错误的响应时,   丢弃当前刷新令牌并请求新的授权码   或访问令牌。特别是在使用刷新令牌时   授权代码授予流程,如果您收到响应   interaction_required或invalid_grant错误代码,放弃刷新   令牌并请求新的授权码。

我还记得维托里奥在他的博客文章(ADAL 3 didn’t return refresh tokens for ~5 months… and nobody noticed)中提到,ADAL 3甚至没有返回刷新令牌。我想一般建议不要在你的应用程序中依赖刷新令牌。

关于注销用户,请参阅此主题:ADAL: W8.1 app trying to log user out,尽管此主题适用于Windows Phone应用程序。

答案 1 :(得分:1)

根据Gaurav提供的链接,以下是ADAD Objective-c的注销代码,适用于Azure AD提供的示例应用程序:

在viewcontroller中:

- (IBAction)logoutUser:(id)sender
{
    [self.unifiedEndpointClient logoutUser];
}

在O365UnifiedEndpointOperations中:

-(void)logoutUser
{
    AuthenticationManager *authenticationManager = [AuthenticationManager sharedInstance];
    [authenticationManager removeTokenWithResourceId:_resourceID
                                          withTenant:TENANT_STRING];
}

在AuthenticationManager中:

-(void) removeTokenWithResourceId:(NSString *)resourceId
                       withTenant:(NSString *)tenant
{
    [self.authContext.tokenCacheStore removeAllWithError:nil];

    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]
                                                             delegate: nil
                                                        delegateQueue: [NSOperationQueue mainQueue]];
    NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"https://login.windows.net/%@/oauth2/logout", tenant]];
    [[urlSession dataTaskWithURL:url
               completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
               {
               }] resume];
}