本文介紹的是如何使用Membership 和 Role Provider 來控制 WCF 調用方法的權限。 web
好比咱們有一個WCF Method 叫 GetData(int num),而後咱們只容許Role = "Administrator"的用戶來調用它,這就是本文要介紹的。 sql
首先,咱們先創建一個Solution,Solution裏面有兩個Project,一個是咱們的WCF Service叫MyService,另外是一個客戶端的Web Project,叫 MyClientApp, 在MyClientApp下有個Default.aspx,來調用MyService. 數據庫
裏面的MyService是默認創建的WCF Service,這裏咱們不介紹如何寫一個簡單的WCF 程序。 app
重要的是,在咱們的方法GetData(int value)上加上這麼一句話 ide
-
[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]
意思是咱們只容許Administrator Role的用戶來調用GetDate這個方法 測試
整個的代碼爲 ui
-
[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")]
-
public string GetData(int value)
-
{
-
return string.Format("You entered: {0}", value);
-
}
當運行Default.aspx的時候,咱們看到這樣的結果。 spa
aspnet_regsql創建Membership 數據庫。 orm
完成後修改MyService裏面的Web.config,在這裏必定看好,不是MyClientApp,而是MyService的web.config blog
添加以下
-
<connectionStrings>
-
<add name="WCFDemoConnection"
-
connectionString="Data Source=localhost;Initial Catalog=WCFDemo;User ID=sa;Password=9ijn)OKM;"
-
providerName="Sql.Data.SqlClient" />
-
</connectionStrings>
-
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider" >
-
<providers>
-
<remove name="AspNetSqlRoleProvider" />
-
<remove name="AspNetWindowsTokenRoleProvider" />
-
<add connectionStringName="WCFDemoConnection"
-
applicationName="WCFDemo"
-
name="AspNetSqlRoleProvider"
-
type="System.Web.Security.SqlRoleProvider" />
-
</providers>
-
</roleManager>
-
<membership defaultProvider="AspNetSqlProvider" >
-
<providers>
-
<remove name="AspNetSqlMembershipProvider" />
-
<add connectionStringName="WCFDemoConnection"
-
applicationName="WCFDemo"
-
minRequiredPasswordLength="2"
-
minRequiredNonalphanumericCharacters="0"
-
requiresQuestionAndAnswer="false"
-
requiresUniqueEmail=" false"
-
name="AspNetSqlProvider"
-
type="System.Web.Security.SqlMembershipProvider "
-
enablePasswordRetrieval="true"
-
passwordFormat="Encrypted"
-
maxInvalidPasswordAttempts="20"/>
-
</providers>
-
</membership>
-
<machineKey validationKey="0D9EA75EE7CEF839CACB3DBAC68F420060EC381F315C2C12A80DBBBE7A8ED02079B8371B0654F11549248F58E55B5E74051DC888BA978BE1D733CF452511ECB7 " decryptionKey="BD9A8F945ACCB35EAB54542B771D34CFFE01F026A5FC5857A4253FAA20EA207F" validation="SHA1" decryption=" AES" />
選擇MyService的Project,而後進入到ASP.NET Web Site Administration Tool的界面,在裏面創建兩個Role,一個Administrator,一個是User
而後咱們在創建兩個User,一個是Administrator group裏面的admin,密碼Password,一個是User group裏面的user1,密碼是Password
在MyService\web.config,進行修改,這裏咱們暫時不作Certificate Check, 因此咱們使用NoCheck.
-
<behaviors>
-
-
<serviceBehaviors>
-
-
<behavior>
-
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider">
-
</serviceAuthorization>
-
<serviceMetadata httpGetEnabled="true" />
-
<serviceDebug includeExceptionDetailInFaults="false" />
-
<serviceCredentials>
-
<clientCertificate >
-
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
-
<certificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
-
</clientCertificate>
-
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
-
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
-
membershipProviderName="AspNetSqlProvider" />
-
</serviceCredentials>
-
</behavior>
-
</serviceBehaviors>
-
</behaviors>
在MyClientApp端進,Add Reference,自動生成web.config,
進行測試,輸入正確的用戶名密碼
-
try
-
{
-
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
-
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
-
client.ClientCredentials.UserName.UserName = "admin";
-
client.ClientCredentials.UserName.Password = "Password";
-
Response.Write(client.GetData(5));
-
}
-
catch (Exception ex)
-
{
-
Response.Write(ex.Message);
-
}
輸入另外User group內User1,
-
try
-
{
-
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
-
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
-
client.ClientCredentials.UserName.UserName = "user1";
-
client.ClientCredentials.UserName.Password = "Password";
-
Response.Write(client.GetData(5));
-
}
-
catch (Exception ex)
-
{
-
Response.Write(ex.Message);
-
}