3

希望你们能帮我澄清一些。我有一个使用 Sql Membership Provider 的 Web 应用程序,它通过 WCF 服务与第二个 Web 应用程序对话。两个应用程序共享同一个 Sql Membership Provider 数据存储......但我需要每个 WCF 服务调用来验证用户身份。

现在,我查看了很多示例,但我觉得我看到的示例要么遗漏了某些代码,因为它“应该”对我来说很明显,或者我误解了 WCF 如何处理请求(见预期下面的代码)。

我很感激任何帮助...

这是我已经知道该怎么做

  1. 我知道如何在两端配置 Sql Membership。
  2. 我知道如何设置 wsHttpBinding
  3. 我知道如何设置用于传输安全的服务证书

这就是我的困惑

  1. 我怎样才能通过会员密码(......你不能)
  2. 我是否通过了身份验证 cookie?如果是这样,怎么做?
  3. 我是否创建与用户(他们自己)无关的“已知”用户名和密码?

在网络客户端中,我希望看到类似这样的代码

protected void btnLogin_Click(object sender, EventArgs e)
{
    // Logging into the web-application is known and easy.
    if (Membership.ValidateUser("MyUserName", "MyPassword"))
    {
        FormsAuthentication.SetAuthCookie("MyUserName", true);
        FormsAuthentication.RedirectFromLoginPage("MyUserName", false);
    }
}

protected ServiceReference1.Contractor getContractor(Int32 key)
{
    // I expect something "like" this on the client call.
    MembershipUser user = Membership.GetUser("MyUserName");

    ServiceReference1.FishDataClient wcfService = new ServiceReference1.FishDataClient();

    // You can't retreive the users password directly,
    // nor can you get the hash from the SqlMembershipProvider.
    wcfService.ChannelFactory.Credentials.UserName.UserName = user.UserName;
    // So doing something like this would not be possible.
    wcfService.ChannelFactory.Credentials.UserName.Password = "??????";

    // So how is the web service going to authenticate the user from it's
    // references to the same SqlMembershipProvider (database).
    ServiceReference1.Contractor contractor = wcfService.GetContractor(key);

    wcfService.Close();
    wcfService = null;

    return contractor;
}

在 WCF 服务中,我希望看到类似这样的代码

[PrincipalPermission(SecurityAction.Demand, Role = "User")]
public Contractor GetContractor(Int32 key)
{
    ServiceSecurityContext context = ServiceSecurityContext.Current;
    Contractor contractor = new Contractor();

    // What goes here?  I would expect something like this...
    if (Membership.ValidateUser("???????", "???????"))
        contractor.Get(key);

    return contractor;
}
4

2 回答 2

1

我假设您的 WCF 成员资格提供程序和您的 Web 应用程序成员资格提供程序使用相同的后端用户集。

如果是这样,您可能希望在应用程序之间共享身份验证 cookie。您可以在此处找到有关如何执行此操作的更多信息。

接下来,您需要将 Web 应用程序请求附带的身份验证 cookie 传递给 WCF 服务调用。你可以在这里看到如何做到这一点。

这个想法是用户登录到您的 Web 应用程序,并通过这样做登录到您的 WCF 服务。

于 2010-08-10T17:24:54.250 回答
0

在下面的链接中查看“Web to Remote WCF Using Transport Security (Trusted Subsystem, HTTP)”,我相信您可能会在那里找到答案。我认为还有以下代码可能会有所帮助:

app.Context.User = new GenericPrincipal(new
       GenericIdentity(username, "Membership Provider"), roles);

还:

NetworkCredential netCred = new NetworkCredential("username", " p@ssw0rd");
asmxwebservice.Service proxy = new asmxwebservice.Service();
proxy.Credentials = netCred;               
proxy.GetData(21, true);

否则,我会建议回到基础,因此在使用 asp 客户端(asp.net 应用程序)中的成员资格和角色提供程序时,确保获得预期的身份验证和授权配置以 100% 工作。

然后对 WCF 服务上的成员资格和角色使用相同的配置。唯一突出的部分是确保绑定正常工作。

我还没有尝试过表单身份验证,但最近实现了从调用 IIS 中托管的 WCF 服务的 ASP.NET 应用程序实现 Windows 身份验证,我发现配置文件(绑定)中的一个小错误可能会导致您的应用程序中断。

通过将用户上下文设置为通用主体,您应该能够在 WCF 服务端接收用户详细信息。

我通过阅读许多文章的字里行间找到了答案,因此请确保您查看以下内容:

希望这可以帮助

于 2011-03-04T13:28:09.990 回答