经过身份验证的 WCF:获取当前的安全上下文

分享于2023年04月08日 c# wcf web-services 问答
【问题标题】:Authenticated WCF: Getting the Current Security Context经过身份验证的 WCF:获取当前的安全上下文
【发布时间】:2023-04-07 22:48:01
【问题描述】:

我有以下场景:

  • 我的数据库中存储了各种用户数据。
  • 此数据是通过 Web 应用程序输入的。
  • 我们希望通过 Web 服务将这些数据公开给用户,以便他们可以将数据与其应用程序集成。
  • 我们还希望在这些服务上公开一些业务逻辑。因此 我们不想使用 OData。
  • 这是一个多租户应用程序,因此我只想将 他们的 数据公开给他们,而不是其他用户。同样,我们公开的业务逻辑应该与经过身份验证的用户相关。

我想让用户使用 OASIS 方案对 Web 服务进行身份验证——据我所知,WCF 已经允许开箱即用——或者我们可以向他们颁发证书以进行身份​​验证。那一点还没有真正解决。

这是我设想的如何在服务中工作的一些伪代码:

function GetUsersData(id) 
 var user := Lookup User based on Username from Auth Context
 var data := Get Data From Repository based on "user"
 return data
end function

对于业务逻辑场景,我认为它看起来像这样:

function PerformBusinessLogic(someData)
 var user := Lookup User based on Username from Auth Context
 var returnValue := Perform some logic based on supplied data
 return returnValue
end function

这里的难点在于获取用户进行身份验证的当前用户名(或证书场景中的证书信息)!

WCF 是否甚至支持这种情况?如果不是,WSE3 会启用此功能吗?

谢谢,


【解决方案1】:

我认为应该不会太难:

  • 如果您的用户在您的 WCF 服务中使用 Windows 用户凭据进行身份验证,您将能够在

    下找到他们的凭据
    ServiceSecurityContext.Current.WindowsIdentity
    
  • 如果您的用户使用证书进行身份验证,您会在

    下找到他们的身份(将是 CertificateIdentity 而不是 WindowsIdentity)
    ServiceSecurityContext.Current.PrimaryIdentity
    

给定 Windows 身份,如果需要,您还可以模拟该调用者以进行后续调用到您的业务或数据层 - 查看 MSDN 文档 Delegation and Impersonation with WCF ,或者 Google 或 Bing 的“WCF 模拟”应该会给你一个关于该主题的大量有价值的链接。

如果 Windows 和证书路径都不适合您,WCF 还允许您创建自己的自定义身份验证方案,在这种情况下,您需要为 WCF 编写扩展,插入它,您会得到发送给您的呼叫用户的用户名/密码,用于针对您可能拥有的任何类型的自定义商店进行验证。

WCF 在许多方面为您提供了 很多 的灵活性 - 我非常怀疑您会找到在 WSE3 中有效但在 WCF 中效果不佳(或更好)的场景! p>

【讨论】:

  • 太棒了,谢谢!这是我所希望的确切信息,出于某种原因,我想我一定在文档中错过了这一点。
  • 我也在努力解决这个问题。我希望看到它在我的本地机器上运行,测试客户端也在我的本地机器上运行。我已经设置了 SSL 和正确的(我认为)HTTPS 绑定配置。我看到当前上下文为空,而匿名上下文虽然不为空,但没有我期望的值,因为用户名是一个空字符串。我需要更改一些 IIS 设置吗?
  • 突然 ServiceSecurityContext.Current.PrimaryIdentity 正在工作,不再为空,并且我看到预期的用户名在调试行中被吐出,但 VS 调试器不会调试我的 Web 服务器,说有些东西是'配置不正确。
  • 如果他们通过 Forms 身份验证怎么办?我们有相同的场景,但我们的用户使用 Forms 进行身份验证。
  • @esteban araya:在这种情况下应该设置 .PrimaryIdentity