許多開發者詢問如何設定 ADO.NET Data Service 的存取權限。實際上,其權限設定方式與一般 ASP.NET 網站資源存取權限配置完全一致。本文將以 ADO.NET Data Service 範例為基礎,詳細說明如何規劃與實作資源訪問權限控制。
首先需要規劃 ASP.NET 網站的資源目錄結構,如下圖所示:

在 Web.config 中依據上述結構進行權限設定,核心配置如下:
<authentication mode="Forms">
<forms name="poweridtag" loginUrl="publicweb/login.aspx" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
<location path="ClientBin">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="publicweb">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
此配置採用表單驗證,預設拒絕匿名用戶存取,但針對 ClientBin(Silverlight 應用程式檔案)與 publicweb(公開頁面如登入頁)開放所有用戶存取。
在 publicweb 目錄下新增 loginService.svc 服務,提供登入驗證功能:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class loginService
{
[OperationContract]
public string login(string userID, string password)
{
// 實際專案中應驗證 userID 與 password
System.Web.Security.FormsAuthentication.SetAuthCookie("dbadmin", false);
return "ok";
}
}
在 Silverlight 專案中加入服務參考,並透過非同步方式呼叫登入:
private void login_Click(object sender, RoutedEventArgs e)
{
loginServer.loginServiceClient lsr = new SilverlightApplication.loginServer.loginServiceClient();
lsr.loginCompleted += new EventHandler<SilverlightApplication.loginServer.loginCompletedEventArgs>(lsr_loginCompleted);
lsr.loginAsync(this.userID.Text, this.password.Text);
}
void lsr_loginCompleted(object sender, SilverlightApplication.loginServer.loginCompletedEventArgs e)
{
if (e.Result == "ok")
{
MessageBox.Show("登入成功");
}
}
完成上述設定後,執行應用程式即可看到登入流程正常運作:



透過標準 ASP.NET 權限機制搭配 Silverlight 服務呼叫,即可輕鬆實現 ADO.NET Data Service 的安全存取控制。