我想让远程管理员(使用本地或域凭据)通过WCF TCP绑定控制我的Windows服务。为此,我需要以管理员身份验证远程用户。我可以检查主要用户/角色,但我不知道如何提示远程用户提供正确的用户详细信息/令牌。
这与我之前关于Restricting WCF TCP endpoint to Administrators的问题有关。我没有将[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]
添加到我的受限服务方法并抓住SecurityException
,而是可以通过以下方式检查:
if (!System.Threading.Thread.CurrentPrincipal.IsInRole("Administrators"))
return MethodResult.AccessDenied;
// haven't tested if it's the service thread or the remote user yet.
如果返回了拒绝访问结果,如何提示远程用户进行Windows身份验证,以便我可以将连接重新启动为其他主体?
当然,需要在远程用户的客户端应用程序上进行更改。也许有更简洁的WCF方式来做到这一点?
编辑:搜索“.net模拟”会让我在CodeProject上找到this。没有机会看,但这可能是要走的路。
答案 0 :(得分:1)
您需要使用WCF调用传递用户的凭据。通常,客户端应用程序只是“捕获”当前正在运行的用户的凭据。或者,您可以明确指定用户名和密码。因此,如果您愿意,可以提示用户提供另一组凭据。
无论哪种方式,客户端应用程序都需要提示用户。您的WCF调用应在授权失败时返回错误(代码或异常),并且您的客户端应捕获该返回并向用户显示提示并使用新凭据重试。 WCF本身无法处理提示用户。
这是一篇关于传递证书的各种方法的文章:
http://blogs.msdn.com/b/sonuarora/archive/2007/04/21/setting-client-credentials.aspx
答案 1 :(得分:0)
假设它在IIS中托管,您需要在IIS管理器中关闭匿名身份验证。这应该强制用户使用Windows帐户登录计算机。您可能还需要启用ASP.NET模拟。
答案 2 :(得分:0)
以下是使用pInvoke How to show authentication dialog in C# .Net 3.5 SP1
提示用户使用标准窗口对话框的方法