wcf - 使用SQL成员资格提供程序的WCF身份验证

标签 wcf service forms-authentication sqlmembershipprovider

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

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

我很感谢您的帮助...

我已经知道该怎么做

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

    这里是我对的困惑
  • 我如何通过 member 密码(...不能)
  • 我是否通过身份验证cookie?如果是这样,怎么办?
  • 我是否创建与用户(自己)无关的“已知”用户名和密码?

  • 我希望在Web客户中看到这样的代码
    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;
    }
    

    最佳答案

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

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

    接下来,您需要将Web应用程序请求随附的身份验证cookie传递给WCF服务调用。您可以看到如何执行here

    这个想法是用户登录到Web应用程序,然后登录到WCF服务。

    关于wcf - 使用SQL成员资格提供程序的WCF身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451578/

    相关文章:

    ASP.NET 2.0 和 4.0 在表单例份验证中似乎以不同方式处理根 url

    c# - 从服务端访问 WCF 身份验证信息

    c# - 无法加载类型 System.Runtime.Diagnostics.ITraceSourceStringProvider

    silverlight - 将 WCF 双工轮询与 Silverlight 结合使用时出现死锁

    android - 如何删除 Android Lollipop 中的前台通知?

    php - 无法启动/重启 PHP 7.2 FPM 服务(CentOS 7、Apache)

    c# - 如何在 Forms.Authentication 和 ReturnUrl 之间插入确认对话框?

    c# - 以编程方式让客户端应用程序使用 URL 列出在运行时创建的 WCF 服务端点(如 WCF 测试客户端所做的那样)

    android - Appcelerator Android 服务后台停止

    asp.net - 在同一域的两个网站之间共享 cookie