2012-04-11 18 views
0

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> 

答えて

0

が見えます今すぐ回答を投稿することができます。私は結局アカウントを削除しないと思う。しかし、ああ、あまりにも騒ぎにはあまり親切ではありません。とにかく

、私はSqlPersonalizationProviderを拡張することによって、問題を解決:

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 

そしてweb.configファイルに:

<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> 
関連する問題