AdalLib 1.2.11

AdalLib 1.2.11

Duy Dang 维护。



AdalLib 1.2.11

Microsoft Azure Active Directory Authentication Library (ADAL) for iOS

注意:ADAL 1.x 已进入维护模式。我们建议尽快更新到 2.x。

如何使用 Cocoapods 更新您的应用程序(推荐)

如果您的库正在使用 1.2 版本,确保以下行位于您的应用程序根目录中的 Podfile 文件中:

pod 'AdalLib', '~> 1.2'

完成后,运行 pod update 命令来更新您的应用程序。

如何使用源更新您的应用程序

  1. 从您需要的任务下载最新代码。
  2. 在 XCode 11 或更高版本的项目中,点击 File -> Add Files
  3. 在出现的 Finder 中,导航到您下载 ADAL 源的位置。转到 ADAL 文件夹,选择 ADAL.xcodeproj 并点击 Add。
  4. 您会在左侧的项目列表中看到另一个名为 ADAL.xcodeproj 的项目。
  5. 在您的应用程序的“链接框架和库”的通用项目设置中,确保ADALiOS.a已列出,并且字体颜色不是红色。红色字体表示Xcode找不到库,您需要通过移除条目并重新添加来更新位置。
  6. 如果它不在那里或字体颜色是红色,请按“+”图标。您应该看到可用库中的ADALiOS.a。选择它,然后点击确定。
  7. 可选:如果您想使用框架,也可以选择框架版本。请确保您选择的是iOS目标,而不是框架的Mac目标。
  8. 编译并测试您的应用程序。

=====================================

Build Status

ADAL SDK for iOS和Mac OS X使您能够通过几行额外的代码为应用程序添加对工作帐户的支持。此SDK为您的应用程序提供了Microsoft Azure AD的全部功能,包括对OAuth2行业标准协议的支持、与用户级别同意的Web API集成以及双因素身份验证支持。最好的是,它是FOSS(免费和开源软件),这样您可以在我们构建这些库的同时参与开发过程。

贡献历史

Stories in Ready

Throughput Graph

示例和文档

我们在GitHub上提供了一套完整的示例应用程序和文档,以帮助您开始学习Azure Identity系统。 这包括针对如Windows、Windows Phone、iOS、OSX、Android和Linux等原生客户端的教程。我们还提供了对OAuth2、OpenID Connect、Graph API和其他出色功能的完整指南。

您的iOS Azure Identity示例在此: https://github.com/AzureADSamples/NativeClient-iOS

社区帮助和支持

我们利用Stack Overflow与社区合作来支持Azure Active Directory及其SDK,包括这个!我们强烈建议您在Stack Overflow上提问(我们都在那里!)同时浏览现有问题,看看是否有人以前提出过类似的问题。

我们建议您使用"adal"标签,这样我们就可以看到它了!这是Stack Overflow上关于ADAL的最新问答:http://stackoverflow.com/questions/tagged/adal

贡献

所有代码均在MIT许可下,并且在GitHub上积极进行问题分类。我们热情欢迎贡献和反馈。您现在可以克隆仓库开始贡献。

快速开始

  1. 克隆仓库到您的机器
  2. 构建库
  3. 将ADALiOS库添加到您的项目中
  4. 将ADALiOSBundle中的storyboards添加到您的项目资源中
  5. 将libADALiOS添加到“链接库”阶段。

##下载

我们为您提供了多种方式在iOS项目中使用此库。

###选项1:源码包

要下载源代码的副本,请点击页面右侧的“下载ZIP”或点击此处

###选项2:CocoaPods

pod 'AdalLib', '~> 1.2'

用法

在Xcode项目中设置密钥链共享权限

在Xcode的导航器窗格中点击您的项目。单击您的应用程序目标,然后选择“能力”选项卡。滚动到“密钥链共享”,并切换为开启。将“com.microsoft.adalcache”添加到该列表中。

或者,您也可以通过将密钥链共享组设置为应用程序的包ID来禁用密钥链共享。

    [[ADAuthenticationSettings sharedInstance] setSharedCacheKeychainGroup:@"<your.bundle.id.here>"];

ADAuthenticationContext

API 的起点在 ADAuthenticationContext.h 头文件中。ADAuthenticationContext 是用于获取、缓存和提供访问令牌的主要类。

如何从 SDK 中快速获取令牌

	ADAuthenticationContext* authContext;
	NSString* authority;
	NSString* redirectUriString;
	NSString* resourceId;
	NSString* clientId;

+(void) getToken : (BOOL) clearCache completionHandler:(void (^) (NSString*))completionBlock;
{
    ADAuthenticationError *error;
    authContext = [ADAuthenticationContext authenticationContextWithAuthority:authority
                                                                        error:&error];
    
    NSURL *redirectUri = [NSURL URLWithString:redirectUriString];
    
    if(clearCache){
        [authContext.tokenCacheStore removeAll];
    }
    
    [authContext acquireTokenWithResource:resourceId
                                 clientId:clientId
                              redirectUri:redirectUri
                          completionBlock:^(ADAuthenticationResult *result) {
        if (AD_SUCCEEDED != result.status){
            // display error on the screen
            [self showError:result.error.errorDetails];
        }
        else{
            completionBlock(result.accessToken);
        }
    }];
}

将令牌添加到 authHeader 以访问 API

	+(NSArray*) getTodoList:(id)delegate
	{
    __block NSMutableArray *scenarioList = nil;
    
    [self getToken:YES completionHandler:^(NSString* accessToken){
    
    NSURL *todoRestApiURL = [[NSURL alloc]initWithString:todoRestApiUrlString];
            
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:todoRestApiURL];
            
    NSString *authHeader = [NSString stringWithFormat:@"Bearer %@", accessToken];
            
    [request addValue:authHeader forHTTPHeaderField:@"Authorization"];
            
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
            
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                
            if (error == nil){
                    
            NSArray *scenarios = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
                
            todoList = [[NSMutableArray alloc]init];
                    
            //each object is a key value pair
            NSDictionary *keyVauePairs;
                    
            for(int i =0; i < todo.count; i++)
            {
                keyVauePairs = [todo objectAtIndex:i];
                        
                Task *s = [[Task alloc]init];
                        
                s.id = (NSInteger)[keyVauePairs objectForKey:@"TaskId"];
                s.description = [keyVauePairs objectForKey:@"TaskDescr"];
                
                [todoList addObject:s];
                
             }
                
            }
        
        [delegate updateTodoList:TodoList];
        
        }];
        
    }];
    return nil; } 

诊断

日志

ADAL 严重依赖日志来诊断问题。强烈建议您设置 ADAL 日志回调,并为用户提供在出现身份验证问题时提交日志的方法。

日志回调

您可以设置一个回调来捕获 ADAL 日志,并将其集成到您自己的应用程序的日志中

    [ADLogger setLogCallBack:^(ADAL_LOG_LEVEL logLevel, NSString *message, NSString *additionalInformation, NSInteger errorCode) {
        //HANDLE LOG MESSAGE HERE
    }]

否则,ADAL 默认输出到 NSLog,这将在控制台打印消息。

示例日志消息

ADAL iOS的消息部分格式为ADALiOS [时间戳 - 关联ID] 消息

ADALiOS [2015-06-22 19:42:53 - 1030CB25-798F-4A6F-97DF-04A3A3E9DFF2] ADAL API call [Version - 1.2.5]

提供关联ID和时间戳对于跟踪问题至关重要。唯一可靠地获取它们的地方是来自ADAL日志。

日志级别
  • ADAL_LOG_LEVEL_NO_LOG (禁用所有日志)
  • ADAL_LOG_LEVEL_ERROR (默认级别,仅在发生错误时输出信息)
  • ADAL_LOG_LEVEL_WARNING (警告)
  • ADAL_LOG_LEVEL_INFO (库入口点,带有参数和关键链操作)
  • ADAL_LOG_LEVEL_Verbose (API追踪 )

要在您的应用程序中设置日志级别,请调用+[ADLogger setLevel:]

[ADLogger setLevel:ADAL_LOG_LEVEL_INFO]

网络追踪

您可以使用各种工具来捕获ADAL生成的HTTP流量。如果您熟悉OAuth协议或需要向Microsoft或其他支持渠道提供诊断信息,这非常有用。

Charles是最容易使用的OSX HTTP追踪工具。使用以下链接设置它以正确记录ADAL网络流量。为了使其有用,必须配置Charles来记录未加密的SSL流量。注意:以这种方式生成的跟踪可能包含高度敏感的信息,例如访问令牌、用户名和密码。
如果您正在使用生产帐户,请勿将这些跟踪与第三方共享。如果您需要向某人提供跟踪以获取支持,请使用您不介意共享的用户名和密码的临时帐户重现问题。

ADAuthenticationError

当发生错误时,ADALError将提供在ADAuthenticationResult的error属性中所有回调的所有ADAuthenticationError。它们可用于使应用程序向用户显示更详细的信息,但是ADAL错误消息没有本地化。所有ADAuthenticationError都以ADAL记录器的形式进行记录。

##常见问题

使用ADAL库的应用程序崩溃,出现以下异常
*** 应用程序因未捕获的异常 'NSInvalidArgumentException' 而终止,原因:'+[NSString isStringNilOrBlank:]: unrecognized selector sent to class 0x13dc800'

解决方案:确保您已将“-ObjC”标志添加到应用程序的“其它链接器标志”构建设置中。有关更多信息,请参阅Apple文档中有关使用静态库的使用说明
https://developer.apple.com/library/ios/technotes/iOSStaticLibraries/Articles/configuration.html#//apple_ref/doc/uid/TP40012554-CH3-SW1.

登录信息无法持久保存,缓存总是返回空

解决方案:要么将“com.microsoft.adalcache”钥匙串共享权限添加到您的应用程序中,要么在ADAuthenticationSettings中通过传递您的应用程序包标识来禁用钥匙串共享

    [[ADAuthenticationSettings sharedInstance] setSharedCacheKeychainGroup:@"<your.bundle.id.here>"];

在iOS 9及更高版本中,ADAL持续返回SSL错误

iOS 9增加了App Transport Security (ATS)。ATS限制了应用程序访问互联网,除非它们满足包括TLS 1.2和SHA-256在内的几个安全要求。它还阻止了依赖于自签名证书破解SSL的轨迹网络。需要在应用程序的info.plist文件中禁用ATS,有关更多信息请参阅关于NSAppTransport info.plist键的文档

许可

版权(c) 微软开源技术公司。保留所有权利。在Apache许可证2.0版本下许可(“许可证”);