![](/img/trans.png)
[英]Silverlight Security Concern when Dynamically Setting Connection String with Entity Framework
[英]Silverlight Entity Framework Dynamic Connection String
我在一堆不同的服務器上有相同的數據模型。 我想根據用戶是誰以及他們在做什么動態創建連接字符串。
我的用戶可以在多個服務器上擁有多個數據庫。 創建DomainService時,我需要一種干凈的方法來構建連接字符串。
我看到DomainService有一個重寫(繼承自LinqToEntitiesDomainService),稱為CreateObjectContext(),它將允許我設置所需的任何連接字符串,然后返回新實體,並且生活很美好。 問題是,CreateObjectContext()在構造函數之后被調用,所以我無法通過invoke方法設置字符串。 另外,我嘗試在DomainService上創建一個新的參數化構造函數,但從未將其復制到客戶端上的DomainContext中。
如果我能夠拉出我的連接字符串,CreateObjectContext()會很好用,但是由於我必須使用來自客戶端的數據來確定要連接的數據庫,所以這顯然行不通。
我考慮的越多,我就越覺得自定義構造函數正是我所需要的-只是不知道如何完成該工作。
我想念什么?
我找到了解決方案。 對於那些感興趣的人,這里是:
感覺有點像黑客,但這是我能想到的唯一解決方案。 感謝Sally Xu在forums.silverlight.net上獲得的想法。
由於我的每個用戶都可以在多個服務器上擁有多個數據庫,因此我需要在首次使用DomainService之前找到一種創建ConnectionString的方法。 每次用戶從UI中選擇一個新項目時,我都會設置如下cookie:
private void SetCookie(string cookieName, string cookieValue)
{
DateTime expireDate = DateTime.Now + TimeSpan.FromDays(1);
string newCookie = cookieName + "=" + cookieValue + ";expires=" + expireDate.ToString("R");
HtmlPage.Document.SetProperty("cookie", newCookie);
}
cookieName是SelectedProjectId
,而cookieValue是UI中當前選擇的項目。
然后,像往常一樣創建一個新的DomainService,但是我覆蓋了CreateObjectContext()
。 首次引用DomainService對象時,將調用此方法。 我的覆蓋看起來像這樣:
protected override ProjectEntities CreateObjectContext()
{
long projectId = -1;
StringBuilder connection;
if (System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"] != null)
{
projectId = Convert.ToInt64(System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"].Value);
}
else throw new Exception("Selected Project ID Exception"); // temporary
// Verify this user has access to the DB just in case it's spoofed
// Lookup project ID in my database to get the database name and server name
// Load template connection string found in web.config
// Replace the template holders for SERVER_NAME and DATABASE_NAME with above lookup values
return new ProjectEntities(MyDynamicConnectionString);
}
再說一次,這有點駭人聽聞,但這是我可以找到動態創建滿足我需求的連接字符串的唯一方法。 我希望這可以幫助其他人...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.