我正在实施一个安全的WCF服务。认证是使用用户名/密码或Windows凭据进行的。该服务托管在Windows服务进程中。现在,我正在尝试找出为每个服务操作实施最佳授权方式。
例如,考虑以下方法:
public EntityInfo GetEntityInfo(string entityId);
正如您所知,在WCF中,有一个OperationContext对象,您可以从中检索调用方/客户端传递的安全凭据。现在,身份验证已经在方法的第一行被完成。然而,如果决策取决于输入数据,我们该如何实施授权呢?例如,在上述情况中,假设“管理员”用户(其权限等存储在数据库中)被允许获取实体信息,其他用户则不被允许......我们应该在哪里放置授权检查呢?
比如我们把它放在方法的第一行:
CheckAccessPermission(PermissionType.GetEntity, user, entityId) //user is pulled from the current OperationContext
现在有几个问题:
我们是在授权检查之前还是之后验证entityId(例如检查空值/空字符串等)?换句话说,如果授权检查应包含在每个方法中,这是一个好的模式吗?参数验证和授权哪个应该先发生?
当授权检查到处都是时,我们如何对WCF服务进行单元测试,而且在单元测试中没有OperationContext!?(假设我正在直接测试此服务类实现,而没有任何WCF设置)。