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