通过 WCF 服务对 MVC 客户端应用程序进行身份验证和授权?

Authentication and Authorization of an MVC client application throgh WCF service?

首先,如果这个问题已经被问过,我很抱歉。我已经搜索了很长时间,有很多与此相关的问题,但我无法解决这个问题。

我必须使用 WCF 服务和 ASP.NET MVC 构建应用程序。我之前使用过 MVC,但我对 WCF 服务完全陌生。应用程序的体系结构是我从 WCF 服务访问数据库并在 WCF 中编写所有代码。 MVC 充当客户端,我只是在 MVC 中添加服务引用以使用该服务并为每个操作调用 WCF。

现在我的问题是如何使用此体系结构实现身份验证和授权。我只想拥有注册、登录功能和一些角色。就像我们在使用 MVC 时如何使用 ASP.NET 成员资格来实现注册、登录功能和管理角色,WCF 中有类似的东西吗?无论如何,我可以直接从 MVC 客户端使用成员资格而无需在客户端连接数据库,比如在配置中进行一些更改以便我们可以通过 WCF 连接到数据库?

根据我目前所读的内容,我可以使用 ASP.net 成员资格,但我需要对配置进行一些更改。不管我读了多少文章,我仍然对如何做到这一点感到困惑。

任何人都可以详细解释一下,我应该在客户端和服务配置中做哪些更改才能使其正常工作?或者给我一个解释这个的指南?我试图从一个星期开始理解这一点,我阅读的每篇文章都提到更改 web.config 代码,但他们从未提及它是客户的 web.config 文件还是服务中的 web.config 文件。

P.s:对于问题或标题中的任何错误,我深表歉意。我希望我能清楚地问我的问题,如果不是,请让我清楚地解释。这是我的第一个问题,在此先感谢。

WCF 可以使用 ASP.NET 成员资格提供程序。当集成到 WCF 应用程序中时,用户必须向 WCF 客户端应用程序提供用户 name/password 组合。要将数据传输到 WCF 服务,请使用支持用户 name/password 凭据的绑定,例如 WSHttpBinding(在配置中为 wsHttpBinding)并将客户端凭据类型设置为 UserName。在服务上,WCF安全根据用户名和密码对用户进行身份验证,同时也分配ASP.NET角色指定的角色。

关于它的更多信息,可以参考这篇link

更新:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <connectionStrings>
    <add name="SqlConn" connectionString="server=127.0.0.1;database=aspnetdb;uid=sa;password=123456;" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>
    <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
      <providers>
        <clear />
        <add
          name="SqlMembershipProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="SqlConn"
          applicationName="WcfService2"
          enablePasswordRetrieval="false"
          enablePasswordReset="false"
          requiresQuestionAndAnswer="false"
          requiresUniqueEmail="true"
          passwordFormat="Hashed" />
      </providers>
    </membership>
    <roleManager enabled ="true"
                 defaultProvider ="SqlRoleProvider" >
      <providers>
        <add name ="SqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider"
             connectionStringName="SqlConn"
             applicationName="WcfService2"/>
      </providers>
    </roleManager>
    <compilation debug="true" targetFramework="4.7.2" />
    <httpRuntime targetFramework="4.7.2"/>
  </system.web>
    
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding>
          <security mode="Message">
            <message clientCredentialType="UserName"></message>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider">
          </serviceAuthorization>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider"/>
            <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="9bb09c1d6e719bf7121814cc73451947d410a501"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="wsHttpBinding" scheme="http" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

我们需要结合使用UserName认证和MembershipProvider。客户端调用时通过proxy.ClientCredentials.UserName.UserName传递用户名,通过proxy.ClientCredentials.UserName.Password传递密码