HttpContext.Current.User.IsInRole()
電話RolePrincipal.IsInRole()
用於通過FormsAuthentication驗證的用戶。內部RolePrincipal.IsInRole()
調用SqlRoleProvider.GetRolesForUser()
,該方法創建並銷燬方法中的SqlConnection
對象。
有可能是SQL Server上的其他解決方案來解決這個問題,但是從籬笆我只看到下列選項的.NET方面:
- 實現你自己的角色提供這樣就可以管理自己連接到數據庫。
- 實現您自己的
IPrincipal
對象,以便您可以自行管理與數據庫的連接。
- 在開始您的SubSonic交易前預先獲取角色,並根據需要檢查相關角色的列表。
- 您甚至可能不需要存儲角色,因爲
RolePrincipal.IsInRole()
會在調用角色時緩存角色,並且只有在緩存爲空或無效時才發送到數據庫。在開始交易之前調用IsInRole()
將預先填充RolePrincipal
對象的緩存,這意味着在SubSonic事務中間的後續調用將從緩存中提取角色,而不是連接到數據庫以獲取它們。
我真的不相信最後的想法是好的,因爲我確信有很多方法可能會出錯。我認爲最簡單的解決方案是在開始SubSonic交易之前預先獲取角色。
我希望有幫助。
編輯:爲了完整起見,這裏是RolePrincipal.IsInRole()
執行情況的反射看到:
public bool IsInRole(string role)
{
if (this._Identity == null)
{
throw new ProviderException(SR.GetString("Role_Principal_not_fully_constructed"));
}
if (!this._Identity.IsAuthenticated || (role == null))
{
return false;
}
role = role.Trim();
if (!this.IsRoleListCached)
{
this._Roles.Clear();
foreach (string str in Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name))
{
if (this._Roles[str] == null)
{
this._Roles.Add(str, string.Empty);
}
}
this._IsRoleListCached = true;
this._CachedListChanged = true;
}
return (this._Roles[role] != null);
}
與連接字符串配置它們不會使用SqlConnection對象上的任何影響,以連接到數據庫。 SubSonic和Membership API正在創建不同的SqlConnection對象。 – 2011-04-29 06:12:21
繼承路由是方式,但我必須做額外的工作:D暫時我正在使用存儲過程,但會編寫一組類來包裝供應商調用以供將來使用。 – TheVillageIdiot 2011-05-04 04:53:01