通过 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传递密码
首先,如果这个问题已经被问过,我很抱歉。我已经搜索了很长时间,有很多与此相关的问题,但我无法解决这个问题。
我必须使用 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传递密码