代码之家  ›  专栏  ›  技术社区  ›  Klaus Byskov Pedersen

基于声明感知Web服务的MVVM

  •  1
  • Klaus Byskov Pedersen  · 技术社区  · 15 年前

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

    我已经建立了一个自定义的wif-sts,用来识别那些想调用我的系统提供的一些wcf服务的用户。WCF服务使用自定义授权管理器来确定调用方是否具有调用给定服务所需的声明。

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

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

    你们中有人曾经做过类似的事情吗,或者你们对如何做有什么好的想法吗?

    事先谢谢,

    克劳斯

    2 回复  |  直到 13 年前
        1
  •  1
  •   Reed Copsey    15 年前

    这在一定程度上取决于您在服务中所要求的内容。

    如果您的服务需要相同的声明集,我建议您提供一个只检查声明的服务,并提前调用它。这将允许您“预授权”用户,从而启用/禁用UI的适当部分。当需要呼叫您的实际服务时,用户可以随意呼叫它们,并且您已经检查了它的安全性。

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

    否则,您可以做一些类似于您建议的事情——放入某种形式的目录,您可以查询特定用户。除了只传递一个地址/方法,允许您只传递一个地址,并检索整个允许(或不允许,以较小的为准)方法集可能更好。这样您就可以减少仅用于身份验证的往返行程。

        2
  •  1
  •   Mark Bostleman    13 年前

    我采用的一种方法是对索赔集进行检查,以保护服务背后的方法。我使用属性来用类型、资源和正确的属性值来修饰方法。然后,检查类具有一个请求方法,如果调用方的claimset不包含具有这些属性值的声明,则该方法将引发异常。因此,在执行任何方法代码之前,首先调用索赔检验需求。如果该方法在请求之后仍在执行,则调用方是好的。inspection类中还有一个bool函数来回答相同的问题(调用方是否有适当的声明),而不引发异常。

    然后,我打包检查类,以便它与客户机一起部署,并且,只要客户机也可以获取调用方的索赔集(我通过服务上的get claimset方法提供),那么它就具有进行域模型所做的相同评估所需的一切。然后,我在视图模型中使用ICommand属性的canExecute方法中的claim inspection类的bool方法来启用/禁用控件,并基本上通过不让用户做他们没有声明的事情来防止用户获得授权异常。

    至于客户机如何知道什么方法需要什么声明,我想我应该让客户机开发人员知道。一般来说,在我的项目中,这不是一个大问题,因为这些方法是非常经典的CRUD。因此,如果方法是添加一个苹果,那么所需的声明从直觉上来说就是type=apple,right=add。

    不确定这是否有助于您的情况,但它在我做过的一些项目上工作得很好。