【问题标题】:Understanding WCF Windows Authentication了解 WCF Windows 身份验证
【发布时间】:2012-03-24 04:49:19
【问题描述】:

我有一项带有 Windows 身份验证的服务。使用以下代码,我可以获得(通过使用客户端)使用该服务的用户的 Windows 身份。

String currentUser = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;

服务器中的配置是:

<binding name="messageSecurity">
<security mode="Message">
<message clientCredentialType="Windows"/>
</security>
</binding>

我还在服务器中读到,它正在使用 Kerberos 来实现这一点。

现在,我正试图了解它在我们公司网络中的重要性。在办公室,用户将使用他们的活动目录凭据登录到他们的桌面。我们的服务托管在名为“SERV1”的 Windows 服务器中。

  1. 是否只有有权访问(登录)“SERV1”的用户才能访问该服务?或者所有能够登录办公网络(使用 Active Directory 凭据)的用户都可以使用该服务?

  2. 有没有办法确保只有 CIO 批准的应用程序才能访问服务,同时保持服务作为 Windows 身份验证?

  3. 此身份验证检查是针对每个服务操作调用进行还是仅针对第一次调用进行?

  4. 服务有没有办法知道用户的 Windows 凭据?

注意:据我所知,WindowsAuthentication 可以比作会员提供程序——从一个集中位置提供用户名和密码。它可以与 ASP.Net Membership Provider 或 Active Directory Membership Provider 进行比较。

进一步阅读:

  1. ASP.NET Active Directory Membership Provider and SQL Profile Provider

  2. wcf data contracts authorization

  3. http://www.theserverside.net/tt/articles/showarticle.tss?id=ClaimsBasedSecurityModel

【问题讨论】:

  • 这是一篇非常好的文章,它说明了如何使用 AD 组来限制对服务的访问:stackoverflow.com/a/5136551/29407
  • @Darin。谢谢。我希望该链接适用于我的第二个问题。请问您也可以回答其他问题吗?另外(对于问题 #2),我并不是要根据角色来限制访问;但客户。

标签: c# asp.net .net wcf windows-authentication


【解决方案1】:

只有有权(登录)“SERV1”的用户才能访问该服务吗?

是的 - 这就是在 WCF 服务中使用 Windows 凭据的重点。只有在该 Active Directory 域(或与您的域具有双向完全信任关系的单独域)中拥有域帐户的用户才能访问该服务。

或者所有能够登录办公网络(使用 Active Directory 凭据)的用户都可以使用该服务?

WCF 安全边界是 Active Directory 域 - 不是特定的服务器。

有没有办法确保只有 CIO 批准的应用程序才能访问该服务,并保持服务作为 Windows 身份验证?

这些“CIO 批准”的应用程序与其他应用程序有何不同? WCF 由帐户(通常是用户帐户)访问。您可以限制哪些帐户可以访问您的服务(例如,要求这些帐户是给定 AD 组的成员或其他内容)。您不能真正基于应用程序“限制”(仅当这些应用程序使用特定的应用程序级帐户来访问您的 WCF 服务时)

此身份验证检查是针对每个服务操作调用进行还是仅针对第一次调用进行?

取决于您的服务 - 如果您使用 per-call WCF 服务,则每次调用都会进行检查。如果您在启用“安全协商”的情况下使用每会话 WCF 服务,则检查会在会话开始时进行一次,直到会话结束时才会进行。

服务有没有办法知道用户的 Windows 凭据?

是 - OperationContext.Current.ServiceSecurityContext.WindowsIdentity 用于调用您的服务的 Windows 凭据(Windows 身份)。这不仅仅是用户名.....

【讨论】:

  • 感谢您的明确解释。关于 ServiceSecurityContext.WindowsIdentity 的一个问题。我可以获得用户的姓名和其他详细信息。但是我能知道用户的密码吗?
  • @Lijo: NO - Windows 中有 NO 方式来检索用户的密码。
  • 谢谢。这样我们的讨论就完成了。我将其标记为已回答。
  • @Lijo:抱歉,不,我对基于声明的身份验证没有任何经验。但是请停止向我发送这些请求,好吗?如果这是一个有趣的 WCF 问题,我可以为您提供帮助 - 我会看到它,我很乐意回答。
【解决方案2】:
  1. 这不是身份验证任务,这是授权任务。 Kerberos 负责确保用户经过身份验证(您为他们获得的名称是他们的实际名称)。 LDAP 管理授权。在 Windows 上下文中,这意味着用户应该是某个允许访问服务器内容组的成员(并且服务必须检查是否属于这种情况)。

  2. 应用程序?并不真地。也就是说,Active Directory 中有两种经过身份验证的主体:用户和计算机。但是,如果执行运行的用户有权连接到服务,那么运行什么应用程序又有什么关系呢?换句话说,你不能阻止某人使用他们自己的代码来完全按照你的代码来做。

  3. 应该没关系。身份验证有效,不是吗?实际发生的情况是,正在向应用程序传递一张票证,以证明用户已经通过身份验证(到 KDC,即活动目录服务器)。

  4. 是的,安全上下文,在某种意义上,用户的凭据集。他们可能还拥有其他凭据,但您也可以获得这些凭据。

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多