2015-11-27 32 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分鐘內重複使用該會話,而無需再次詢問用戶。