如何控制WCF身份验证将拒绝的内容?

时间:2011-12-13 19:37:58

标签: wcf authentication

我正在学习和设计WCF服务。我已经选择使用Windows凭证作为身份验证方法,并且我已经正确配置了它,因为我可以在测试本地计算机中托管的服务时从事件日志查看器中看到身份验证审核日志。

但现在我想出了这个奇怪的问题:在这样的配置下用户将不会被认证?我的服务是否对同一Windows域中的所有Windows用户进行身份验证,还是可以指定我的域中的哪些特定用户将/将不会进行身份验证?

或者,这是否意味着我只能控制哪些用户(在我的域中)可以执行我的服务通过授权提供的操作(我知道该怎么做)?

听起来很简单,但我发现的所有材料只告诉你如何进行身份验证,并没有说明如何拒绝身份验证请求。

更新: 在阅读了@syneptody的回答之后,我还有两个问题:

  1. 我必须说我在认证和授权之间的混淆仍然存在。验证意味着识别用户。但是,如果我想告诉属于同一域的用户与服务主机(顺便提一下,是IIS),谁只是向我的服务发出请求,“你没有经过身份验证”,我真正应该说的是“我对您进行身份验证,但您未获得授权(执行您的请求)“,是不是?我的域中的用户没有“Unauthenticated”状态?如果不属于我的域的用户发出请求怎么办?我的服务会告诉他“您未经过身份验证”或“您未获得授权”?只要此用户具有身份,该服务将对其进行身份验证,并继续调查是否应该授权?
  2. @syneptody提到了这个“授权”元素。它属于ASP.NET,它指定哪些角色可以/不能访问资源(无论是网站还是网站中托管的应用程序,具体取决于它所在的Web.config文件)。这样对吗?但是,如果我不使用ASP.NET或者不在ASP.NET兼容模式下托管WCF,它会像那样工作吗?实际上我们的要求是只提供服务,所以我没有考虑使用ASP.NET,因为在我看来它更像是一个消费我服务的网络客户端。 顺便说一句,我的使用场景是这个服务将在Intranet内托管和使用。因此,我选择Windows凭据进行身份验证,使用Windows组进行基于角色的授权,因为在我看来,这需要最少的工作。

1 个答案:

答案 0 :(得分:1)

看看这篇文章: http://msdn.microsoft.com/en-us/library/aa702682.aspx

它解释了WCF和ASP.NET之间的连接。如果能够在ASP.NET兼容模式下运行服务,则可以使用ASP.NET授权规则。在您可以利用集成身份验证的域环境中,没有更简单的方法来为您的服务提供授权。

您的服务实施:

[AspNetCompatibilityRequirements(RequirementsMode AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior]
public class Foo { ... }

然后在你的配置中:

<system.web>   
    <authorization>
      <allow users="?" />
      <allow roles="DOMAIN_SECURITY_GROUP" />
      <deny users="*" />
    </authorization>

    <authentication mode="Windows" />
    <identity impersonate="false" />
  </system.web>