1

我正在为我目前面临的挑战寻找一些意见。

我已经构建了一个自定义 WIF STS,我用它来识别想要调用我的系统提供的某些 WCF 服务的用户。WCF 服务使用自定义授权管理器来确定调用者是否具有调用给定服务所需的声明。

现在,我正在构建一个 WPF 应用程序。在这些 WCF 服务之上。我正在使用 MVVM 模式,以便视图模型调用受保护的 WCF 服务(实现模型)。我面临的挑战是我不知道当前用户是否可以成功调用 Web 服务方法而不实际调用它们。基本上,我想要实现的是基于成功调用方法的能力启用/禁用 UI 的某些部分。

到目前为止,我提出的最佳解决方案是创建一个服务,该服务基于与自定义授权策略管理器相同的业务逻辑,将能够确定用户是否可以调用给定方法。现在,该方法必须作为一个字符串传递给该服务,或者实际上是两个字符串,ServiceAddress 和 Method (Action),并且基于该输入,该服务将能够确定当前用户是否具有访问所需的声明方法。显然,要使其工作,该服务本身必须需要来自相同 STS 并具有相同声明的已发行令牌才能完成其工作。

你们中的任何人过去有没有做过类似的事情,或者你们对如何做到这一点有什么好主意?

提前致谢,

克劳斯

4

2 回答 2

1

这在一定程度上取决于您在服务中需要什么声明。

如果您的服务需要相同的声明集,我建议您创建一个除了检查声明之外什么都不做的服务,并提前调用。这将使您“预授权”用户,进而启用/禁用 UI 的适当部分。当需要调用您的实际服务时,用户可以随意调用它们,并且您已经检查过它是否安全。

如果服务都需要不同的声明集,并且没有简单的方法来验证它们是否可以提前工作,我只会让用户调用它们,并通过正常的异常处理来处理。但是,这将使生活变得更加棘手,因为您必须让用户尝试(并失败)然后禁用。

否则,您可以执行您建议的操作 - 放入某种形式的目录,您可以查询特定用户。除了仅传递地址/方法之外,允许您仅传递地址并检索整个允许(或不允许,以较小者为准)方法集可能会更好。这样,您可以减少仅用于身份验证的往返行程。

于 2009-11-30T17:57:04.987 回答
1

我采用的一种方法是检查 ClaimSet 以保护服务背后的方法的类。我使用属性来用类型、资源和正确的属性值来装饰方法。然后检查类有一个 Demand 方法,如果调用者的 ClaimSet 不包含具有这些属性值的 Claim 则抛出异常。所以在执行任何方法代码之前,首先调用索赔检查需求。如果请求后方法还在执行,那么调用者是好的。检查类中还有一个 bool 函数来回答相同的问题(调用者是否有适当的声明)而不抛出异常。

然后我打包检查类,以便它与客户端一起部署,并且只要客户端还可以获得调用者的 ClaimSet(我通过服务上的 GetClaimSet 方法提供),那么它就拥有进行相同评估所需的一切域模型正在做。然后,我在我的视图模型中使用 ICommand 属性的 CanExecute 方法中的声明检查类的 bool 方法来启用/禁用控件,并基本上通过不让用户执行他们没有声明的事情来防止用户获得授权异常为了。

As far as how the client knows what claims are required for what methods, I guess I leave that up to the client developer to just know. In general on my projects this isn't a big problem because the methods have been very classic crud. So if the method is to add an Apple, then the claim required is intuitively going to be Type = Apple, Right = Add.

Not sure if this helps your situation but it has worked pretty well on some projects I have done.

于 2009-12-01T19:58:55.017 回答