2015-09-29 70 views
0

我們的體系結構有許多數據庫,都具有相同的模式。我想通過我們的SQL Server的WCF服務公開一個odata服務。我們正在使用實體框架Odata服務提供程序來執行此操作。針對多個數據庫的WCF OData服務

我看到這篇文章,但他的需求需要合併數據。

我只需要身份驗證,然後將用戶引導到他們的數據存儲在數據庫中。

有誰知道如何將圖層添加到odata身份驗證服務,該服務會根據經過身份驗證的用戶將連接字符串設置爲正確的數據庫?

+0

嗯,看起來像微軟寧願你使用web api來實現Odata服務。如果我找到web api和Odata的解決方案,我會回覆。 – TWilly

回答

0

我切換到Web Api 2和Odata集成。

一旦進入Web Api,您可以創建過濾器來掛接和添加邏輯,然後選擇特定的數據庫。

我也可以使用內置的OAuth2進行身份驗證。

public class MyOdataController : ODataController 
{ 
    protected AMMetricsEntities db; 
    protected EntityConnection ec; 
    protected IEnumerable<Claim> claims; 
    protected long userId; 
    protected string userName; 

    private string GetConnectionString(string dbId, string dbName) 
    { 
     // this is where we get token from header information and populate the connection string 
     return 
      String.Format(
       "metadata=res://*/Models.AMModel.csdl|res://*/Models.AMModel.ssdl|res://*/Models.AMModel.msl;" + 
       "provider=System.Data.SqlClient;" + 
       "provider connection string='data source={0};initial catalog={1};persist security info=True;user id={2};password={3};" + 
       "multipleactiveresultsets=True;application name=EntityFramework'", 
       dbServer, 
       dbName, 
       Username, 
       Password); 
    } 

    public MyOdataController() 
    { 

     claims = ((ClaimsIdentity)User.Identity).Claims; 
     if (claims.Any()) 
     { 
      userId = Convert.ToInt64(User.Identity.GetUserId()); 
      userName = User.Identity.GetUserName(); 

      var dbName = claims.Where(s => s.Type == "DBName").Select(c => c.Value).First(); 
      var dbServer = claims.Where(s => s.Type == "DBServer").Select(c => c.Value).First(); 

      ec = new EntityConnection(GetConnectionString(dbServer, dbName)); 
      db = new ProductEntities(ec, false); 
     } 
    } 
}