2016-02-03 45 views
7

私はイントラネットアプリケーションを作成しています。 project.jsonのターゲットフレームワークはdnx451です。 それは私の出版コマンドです:ASP.NET CORE 1.0、偽装

dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1-update1 --no-source 

データベース接続文字列:私は、データベースへのアクセスを偽装しようとしているが、それは働いていない

Server=name;Database=name;Trusted_Connection=True; 

。私がアプリケーションを起動すると、Windowsユーザは認識され、右上にHello、Domain \ Usernameと表示されます。データベースにアクセスしようとすると、「ユーザーDomain \ Computernameのログインに失敗しました」というエラーが表示されます。ユーザーの下でアプリケーションプールを実行すると、すべて正常に動作します。

IIS: .NET CLR Versioはv4.0で、管理されたPipline Mode ClassicとIdentityはApplicationPoolIdentityです。 ウェブサイトの認証:ASP.NET偽装とWindows認証が有効になっています。

偽装が最終的に機能するように変更するにはどうすればよいですか?

答えて

7

コアはすべてのWebコードがKestrelによってホストされているため、偽装をサポートしていません。これを行うには、現在のプリンシパルをWindowsPrincipalとして取得し、次に必要な時点でmanually impersonateを取得する必要があります。

RC1では、WindowsPrincipalを取得していないので、今すぐこの作業を行うことはできません。それはRC2で修正される予定です。

+0

blowdartのソリューションがうまくいく、私はRC1に対してそれをテストした。私は4.5.1:http://impersonation.codeplex.com/をターゲットにしたこのアップデート版を使用しました。これはしばらくの間、同じMSDNの例から生まれたものと思われます。 –

+0

@blowdart:私はdnx-clrだけをターゲットにしていてもまだコアですか? – Dani

+0

はいまだコアです – blowdart

7

すべてのページリクエストでユーザーを偽装する場合は、MVCの前に独自のMiddlewareを実行するように構成できます。

public class Impersonate 
{ 
    private readonly RequestDelegate next; 
    public Impersonate(RequestDelegate next) { 
     this.next = next; 
    } 
    public async Task Invoke(HttpContext context) { 
     var winIdent = context.User.Identity as WindowsIdentity; 
     if (winIdent == null) { 
      await next.Invoke(context); 
     }else { 
      WindowsIdentity.RunImpersonated(winIdent.AccessToken,() => { 
       next.Invoke(context).Wait(); 
      }); 
     } 
    } 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { 
    .... 
    app.UseMiddleware<Impersonate>(); 
    app.UseMvc(...); 
    ... 
} 
+1

そのコードは美しく最新の安定したコアで失敗するmvc =( –

+1

謝罪、私は誤って次のハンドラを非同期に呼び出そうとしていましたが、おそらく偽装は最初に待っていたI/O呼び出しにしか適用されませんでした。 RunImpersonatedが返され、残りのWebパイプラインを待つ代わりに、次のデリゲートが完了するまで(上記のように)偽装がリクエストスレッドをブロックする必要があります。別のスレッドで... –