2015-11-27 33 views
0

我有一个Objective-C应用程序(https://github.com/NBICreator/NBICreator)和一个特权辅助工具。授权会话总是要求助手的用户密码

我有一些不同的特权任务助手需要在一个构建过程中执行,我想让用户只验证一次执行这些任务。

授权有效,但似乎无法在助手中重复使用该会话。即使我向安全管理服务器提供完全相同的权利,并且使用相同的身份验证,但用户始终必须为每个步骤进行身份验证。

我已经阅读了文档,并首先在主应用程序中测试了预认证方法,并尝试打印出来(并在帮助程序中保留auth会话)。但是我所尝试过的东西还没有成功。

我需要som帮助确定安全管理服务器为什么需要重新进行身份验证。

在主分支GitHub上的代码是当前的,我试图通过来回改变的东西和测试。使用该代码,即使我使用相同的身份验证权限,每次调用助手函数时,用户都必须进行身份验证。

这是正确的样子在授权数据库中:

class = rule; 
    created = "470329367.933364"; 
    "default-prompt" =  { 
     "" = "NBICreator is trying to start an Imagr workflow."; 
    }; 
    identifier = "com.github.NBICreator"; 
    modified = "470329367.933364"; 
    requirement = "identifier \"com.github.NBICreator\" and anchor apple generic and certificate leaf[subject.CN] = \"Mac Developer: Erik Berglund (BXUF2UUW7E)\" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */"; 
    rule =  (
     "authenticate-admin" 
    ); 
    version = 0; 

这是我定义的权利:https://github.com/NBICreator/NBICreator/blob/master/NBICreator/Helper/NBCHelperAuthorization.m#L36-L43

NSStringFromSelector(@selector(authorizeWorkflowImagr:withReply:)) : @{ 
          kCommandKeyAuthRightName : @"com.github.NBICreator.workflowImagr", 
          kCommandKeyAuthRightDefault : @kAuthorizationRuleAuthenticateAsAdmin, 
          kCommandKeyAuthRightDesc : NSLocalizedString(
                      @"NBICreator is trying to start an Imagr workflow.", 
                      @"prompt shown when user is required to authorize to add a user" 
                      ) 
          }, 

而这正是我检查,如果用户通过验证: https://github.com/NBICreator/NBICreator/blob/master/NBICreator/Helper/NBCHelperAuthorization.m#L222-L253

+ (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command authRef:(AuthorizationRef)authRef { 
#pragma unused(authData) 
NSError *   error; 
OSStatus   err = 0; 

AuthorizationItem oneRight = { NULL, 0, NULL, 0 }; 
AuthorizationRights rights = { 1, &oneRight }; 

oneRight.name = [@"com.github.NBICreator.workflowImagr" UTF8String]; 

err = AuthorizationCopyRights(
           authRef, 
           &rights, 
           NULL, 
           kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed, 
           NULL 
          ); 

if (err != errAuthorizationSuccess) { 
    NSString *message = CFBridgingRelease(SecCopyErrorMessageString(err, NULL)); 
    error = [NSError errorWithDomain:[[NSProcessInfo processInfo] processName] code:err userInfo:@{ NSLocalizedDescriptionKey : message }]; 
} 

    return error; 
} 

正如你所看到的那样,我正在通过设置一个硬编码的正确名称进行测试,然后将该权利重新提交给安全管理服务器。

我现在陷入困境,似乎无法找到前进的方向。希望这里的某个人可能知道在哪里寻找。

回答

0

我找到了答案,我如何在权利数据库中设置权利。

我使用Apple示例EvenBetterAuthorizationExample的默认代码来创建和使用权限。但是,只有指向this documentation才能使用不同的权利。

这些都没有帮助我与authenticatin一次,并有助手进行身份验证下一次我请求认证的同一权利。

经过一番深入研究并查看授权数据库中的实际规则后,我发现了一种方法来复制AuthenticateWithPrivileges使用的规则,该规则通过验证5分钟来运行,直到需要重新验证。

于是,我改变了我的代码从这个权利创建我的自定义:

NSStringFromSelector(@selector(addUsersToVolumeAtPath:userShortName:userPassword:authorization:withReply:)) : @{ 
          kCommandKeyAuthRightName : NBCAuthorizationRightAddUsers, 
          kCommandKeyAuthRightDefault : @kAuthorizationRuleAuthenticateAsAdmin, 
          kCommandKeyAuthRightDesc : NSLocalizedString(
                      @"NBICreator is trying to add a user.", 
                      @"prompt shown when user is required to authorize to add a user" 
                      ) 
          }, 

要这样:

NSStringFromSelector(@selector(addUsersToVolumeAtPath:userShortName:userPassword:authorization:withReply:)) : @{ 
          kCommandKeyAuthRightName : NBCAuthorizationRightAddUsers, 
          kCommandKeyAuthRightDefault : @{ 
            @"class": @"user", 
            @"group": @"admin", 
            @"timeout": @(300), 
            @"version": @(1), 
            }, 
          kCommandKeyAuthRightDesc : NSLocalizedString(
                      @"NBICreator is trying to add a user.", 
                      @"prompt shown when user is required to authorize to add a user" 
                      ) 
          }, 

因此,而不是使用@kAuthorizationRuleAuthenticateAsAdmin作为RightDefault,我通过在这个字典:

@{ 
    @"class": @"user", 
    @"group": @"admin", 
    @"timeout": @(300), 
    @"version": @(1), 
}, 

A在此之前,我的帮手可以向用户请求授权,然后我可以在5分钟内重复使用该会话,而无需再次询问用户。