授权服务,随着时间的推移保持身份验证

时间:2011-05-03 11:58:03

标签: macos authorization

我想知道是否可以随着时间的推移保持获得的身份验证 这是我的代码:

- (IBAction)toggleAuthentification:(id)sender {
    if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL) == errAuthorizationSuccess) {
        AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
        authRef = NULL;
        AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
        [sender setState:NSOffState];
    } else if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL) == errAuthorizationSuccess) {
        AuthorizationMakeExternalForm(authRef, &extAuthRef);
        [sender setState:NSOnState];

        NSDictionary *authRightInfo;
        if (AuthorizationRightGet(authRights.items[0].name, (CFDictionaryRef *)&authRightInfo) == errAuthorizationSuccess) {
            //[authRightInfo valueForKey:@"timeout"] == 300
            keepAuthTimer = [NSTimer scheduledTimerWithTimeInterval:([[authRightInfo valueForKey:@"timeout"] unsignedShortValue] - 10) target:self selector:@selector(keepAuthentification:) userInfo:nil repeats:YES];
        }
    } else {
        [sender setState:NSOffState];
    }
}

- (void)keepAuthentification:(NSTimer *)aTimer {
    NSLog(@"%d", AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL));
    NSLog(@"keepAuth", aTimer);
}

第1步:点击拨打toggleAuthentification:并成功验证的按钮 第2步:290秒后我从控制台收到0keepAuth,因此,我的NSTimer正常工作。
第3步:再等几秒钟(超过10秒)再次点击我的按钮。 Auth面板重新出现!

为什么我AuthorizationCopyRightskeepAuthentification:的调用不会重置300秒(对于此身份验证权限)超时?

我想要的是app,每个应用程序执行时只需记录一次,或者直到您通过单击按钮手动请求注销。

1 个答案:

答案 0 :(得分:2)

在哪里记录,AuthorizationCopyRights应该重置计时器? AuthorizationCopyRights将从安全子系统请求所请求的权限,安全子系统将立即提供权限或提示用户进行授权。系统必须再次请求用户授权的秒数之后的超时在/etc/authorization中配置,并且也可以设置为0,这意味着系统始终必须重新提示用户。

如果您希望将来多次使用授权权限运行具有root权限的工具(帮助工具),请执行以下操作:

  • 当您需要首次使用root权限运行应用时,请要求用户授权。

  • 授权成功后,不要直接启动helper-tool,而是启动具有root权限的helper-helper-tool。

  • helper-helper-tool在后台继续运行,直到您的应用程序告诉它退出,当您的应用程序本身要退出或用户取消授权时将会是什么情况。

  • helper-helper-tool通过某种IPC方法与您的应用程序通信。 E.g:

    1. 它从stdin读取命令 - 启动任务时,您可以访问其stdin管道(请参阅AuthorizationExecuteWithPrivileges的参数communicationsPipe

    2. 如果helper-helper-tool是用Obj-C编写的,你可以使用Distributed Objects

    3. 如果它不是用Obj-C编写的,并且你不想因任何原因使用文件管道,你可能更喜欢使用UNIX套接字。 UNIX套接字的工作方式类似于网络套接字,但不使用网络协议或网络地址。这两个进程都打开一个服务器UNIX套接字,另一个进程创建一个客户端UNIX套接字并将其连接到服务器套接字。现在两个进程都可以通过该套接字交换数据(在两个方向上,因为套接字总是双向的)。

    4. 如果必须向helper-helper-tool发送大量数据,则上述所有方法都可能相当慢,因为它们涉及复制数据,甚至再次转换,复制和转换数据。在这种情况下,使用POSIX共享内存来传输数据(这是在进程之间传输数据的最快方式,因为数据根本没有传输,它只能同时用于多个进程)并且只使用任何一个以上方法通知其他进程内存内容已更新。

  • 现在向helper-helper-tool发送一个命令,使其启动辅助工具(带有适当的参数)。由于helper-helper-tool以root身份运行,因此helper-tool也将以root身份运行。

  • 由于helper-helper-tool保持活着状态,直到你告诉它退出,它总是可以在需要时启动辅助工具的另一个根实例。

  • 对于您希望在没有root权限的情况下运行helper-tool的情况,只需直接调用它而不使用helper-helper-tool。

当然上面的方法过于复杂,但可能最容易采用当前的代码。我个人根本不会使用辅助工具,而是让辅助工具本身在后台永久运行。然后帮助工具将直接执行请求的操作,或者,如果由于某种原因无法执行,则自行分叉然后执行操作(如果您使用CoreFoundation,Foundation或某些其他Apple框架,这将无效)或自行执行然后使用一个参数重新执行自身,该参数告诉它只执行某个操作然后退出。优点是只有一个辅助工具。