Windows認証でaspnet_personalizationを使用している間に別のユーザーを偽装する方法を理解することに問題があります。aspnet_personalization Windows認証を使用して偽装する方法
私は自分のページにasp.netのパーソナライズ・フレームワークを使用しています:
<asp:WebPartManager ID="WebPartManager1" runat="server" >
<Personalization Enabled="True" />
</asp:WebPartManager>
マイページは、私が変更することはできませんAuthenticationMode =「Windowsのを」(使用する既存のWebアプリケーションであり、そしてIISもに設定されていますWindows認証)。このWebアプリケーションには、スーパーユーザーが他のユーザーになりすますことを許可するページがあります。これは、データベースにアクセスするたびに動的に作成される接続文字列を操作することで実現します。
私の問題は、aspnet_personalizationがまだWindows認証を使用していることです。 aspnet_personalizationによって使用される接続文字列を動的に編集しようとすると、aspnetはそれを使用していないように見えます - 現在のNTアカウントのユーザー名を使用します。
私は私のweb.configファイルの構成タグに以下の持っている:私たちはasp.netでそれを使用することを望ん、ユーザーを偽装するたびに、次のようにコードを追加することで、接続文字列を編集してみました
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="AnotherConnectionString" connectionString="Data Source=serverName;Initial Catalog=dbName;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
applicationName="/"
connectionStringName="AnotherConnectionString" />
</providers>
</membership>
<profile enabled="true" defaultProvider="TableProfileProvider">
<providers>
<clear />
<add name="TableProfileProvider" type="Microsoft.Samples.SqlTableProfileProvider" connectionStringName="AnotherConnectionString" table="aspnet_Profile" applicationName="/" />
</providers>
<!--<properties></properties>-->
</profile>
、それ
Dim settings = ConfigurationManager.ConnectionStrings("AnotherConnectionString")
Dim fi = GetType(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic)
fi.SetValue(settings, False)
settings.ConnectionString = "data source=serverName;database=dbName;user id=" & login & "; password=" & password
私は「AnotherConnectionString」は、所望のユーザ名が含まれていないことのWebPartManagerを含むページのPage_Loadの上で確認でしたが、asp.net_personalizationはまだNTのユーザー名を使用して、その保存されprocsのを呼び出しますされません。
ANSWER:
StackOverflowのは、私は答えを投稿させません。それはばかげているので、私は質問の中に答えを投稿した後、私は自分のアカウントを削除して、他の人に同じことを勧めます。
私はSqlPersonalizationProviderを拡張することによって、問題を解決:web.configファイルで
Imports System.Web.UI.WebControls.WebParts
Public Class MySqlPersonalizationProvider
Inherits SqlPersonalizationProvider
Protected Overrides Sub LoadPersonalizationBlobs(ByVal webPartManager As System.Web.UI.WebControls.WebParts.WebPartManager, ByVal path As String, ByVal userName As String, ByRef sharedDataBlob() As Byte, ByRef userDataBlob() As Byte)
Dim impersonatedName As String = MySession.UserLoginName()
path = path & "|" & impersonatedName
userName = impersonatedName
MyBase.LoadPersonalizationBlobs(webPartManager, path, userName, sharedDataBlob, userDataBlob)
End Sub
Protected Overrides Sub SavePersonalizationBlob(ByVal webPartManager As System.Web.UI.WebControls.WebParts.WebPartManager, ByVal path As String, ByVal userName As String, ByVal dataBlob() As Byte)
Dim impersonatedName As String = MySession.UserLoginName()
path = path & "|" & impersonatedName
userName = impersonatedName
MyBase.SavePersonalizationBlob(webPartManager, path, userName, dataBlob)
End Sub
End Class
そして:
<system.web>
<webParts>
<personalization defaultProvider="AspNetSqlPersonalizationProvider">
<providers>
<remove name="AspNetSqlPersonalizationProvider"/>
<add name="AspNetSqlPersonalizationProvider"
type="MyProject.MySqlPersonalizationProvider"
connectionStringName="MyConnectionString"
applicationName="/"></add>
</providers>
</personalization>
</webParts>
<profile enabled="true" defaultProvider="TableProfileProvider">
<providers>
<clear />
<add name="TableProfileProvider" type="Microsoft.Samples.SqlTableProfileProvider" connectionStringName="iCaseHomepage" table="aspnet_Profile" applicationName="/" />
</providers>
</profile>
</system.web>
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="MyConnectionString" connectionString="Data Source=MyServerName;Initial Catalog=MyDatabaseName;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
、ページ上:私は同じよう
<asp:WebPartManager ID="WebPartManager1" runat="server" >
<Personalization Enabled="True" />
</asp:WebPartManager>