makecert -r -pe -n "CN=MyServer" -ss My -sky exchange
產生自我簽署憑證存入 CurrentUser\My,供服務端加密、客戶端驗證。
<connectionStrings>
<add name="SqlConn" connectionString="Data Source=.;Integrated Security=true;Initial Catalog=aspnetdb" />
</connectionStrings>
<system.web>
<membership defaultProvider="SqlMembershipProvider">
<providers>
<add name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlConn"
applicationName="WCFMembership"
passwordFormat="Hashed" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="SqlRoleProvider">
<providers>
<add name="SqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlConn"
applicationName="WCFMembership" />
</providers>
</roleManager>
</system.web>
<system.serviceModel>
<services>
<service name="WCFMembershipServices.Service1" behaviorConfiguration="MembershipBehavior">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
contract="WCFMembershipServices.IService1" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MembershipBehavior">
<serviceAuthorization principalPermissionMode="UseAspNetRoles"
roleProviderName="SqlRoleProvider" />
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="SqlMembershipProvider" />
<serviceCertificate storeLocation="CurrentUser" storeName="My"
x509FindType="FindBySubjectName" findValue="MyServer" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[ServiceContract]
public interface IService1
{
[OperationContract]
bool Test();
}
public class Service1 : IService1
{
[PrincipalPermission(SecurityAction.Demand, Role = "super user")]
public bool Test() => true;
}
var client = new Service1Client();
client.ClientCredentials.UserName.UserName = "user1";
client.ClientCredentials.UserName.Password = "@abc123";
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
X509CertificateValidationMode.None; // 測試用,正式環境請驗證鏈
client.Test();
此架構結合 WCF 訊息安全與 ASP.NET 成熟會員體系,適合企業級內部服務統一身分管理。