2016-10-25 15 views
1

新しいASP.NET IDクラスを使用するために、MembershipProviderおよびRoleProviderを使用する古いASP.NET Webformsアプリケーションを現在更新しています。さらに、私は自分の依存性注入のためにAutofacを使い、一貫性のために新しいIdentityクラスでそれを使用したいと思っています。ASP.NET Webform、OWIN、およびASP.NET IDによるオートファックミドルウェアの使用方法の理解

ASP.NETアイデンティティは今OWINミドルウェアに依存していると私は、次のStartup.csクラスを追加することによって、自分のアプリケーションにOWINミドルウェアの設定を組み込むことに成功できました:

internal partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     AutofacConfig.RegisterTypes(builder); 
     AutofacConfig.RegisterIdentityTypes(builder, app); 

     var container = builder.Build(); 
     Global.SetContainer(container); 

     app.UseAutofacMiddleware(container); 

     ConfigureAuth(app); 
    } 
} 

私が持つアイデンティティクラスを登録Autofacそのように:私は私のWebフォームに移動したときに

internal static class AutofacConfig 
{  
    public static void RegisterIdentityTypes(ContainerBuilder builder, IAppBuilder app) 
    { 
     builder.RegisterType<ApplicationUserStore>().As<IUserStore<ApplicationUser>>().InstancePerRequest(); 
     builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest(); 
     builder.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest(); 
     builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest(); 
     builder.Register(c => app.GetDataProtectionProvider()).InstancePerRequest(); 
    } 
} 

私が見ることができ、次のApplicationSignInManagerクラスはインスタンス化され、それがAutofacが動作していることを私に示唆するように、そのコンストラクタのパラメータも解決されているページに署名正しく次のメソッドが呼び出されるとApplicationSignInManagerがAutofacプロパティ注射を介してインスタンス化されたページにサインインし、私は自分のWebフォーム上のボタンで自分の記号をクリックし

public class ApplicationSignInManager : SignInManager<ApplicationUser, string> 
{ 
    public ApplicationSignInManager(
     ApplicationUserManager userManager, 
     IAuthenticationManager authenticationManager) 
     : base(userManager, authenticationManager) 
    { 
     // userManager is valid 
     // authenticationManager is valid 
    } 
} 

。これにより、正しいIdentityクラスの実装が呼び出されます。

public partial class SignIn : BasePage 
{ 
    // Autofac property injection 
    public ApplicationSignInManager ApplicationSignInManager { get; set; } 

    .... 

    protected void SignInClick(object sender, EventArgs e) 
    { 
     // Validate the user password 
     var result = this.ApplicationSignInManager.PasswordSignIn(
      this.email.Text, 
      this.password.Text, 
      this.remember.Checked, 
      true); 

     .... 
    } 

だから、すべてがうまくようだが、何かが私にはないと思えるOWINとAutofacが接続され、あるいは必要な場合、私は表示されません。 Startup.csから次の行を削除した場合、その火災に燃料を追加するには...

app.UseAutofacMiddleware(container); 

...すべてはまだ動作するはずです!それは正しいことができない、それはできますか?

protected void SignInClick(object sender, EventArgs e) 
    { 
     var signInManager = this.Context.GetOwinContext().GetUserManager<ApplicationSignInManager>(); 

     // Validate the user password 
     var result = signInManager.PasswordSignIn(
      this.email.Text, 
      this.password.Text, 
      this.remember.Checked, 
      true); 

     .... 
    } 

しかし、「signInManager」変数は常にNULLでそのコードを実行するには:MVCのための

多くの例が、これは(GetOwinContext()呼び出しを介して)アイデンティティオブジェクトを取得するための正しい方法であることを示唆しているようです。

このコードは本当に必要ですか?

app.UseAutofacMiddleware(container); 

誰かが正しい方向に向いていますか?

答えて

3

Documentationが状態単純なシナリオについて

、app.UseAutofacMiddleware(容器) OWIN要求スコープにAutofacのライフタイムを追加するだけでなく、Autofacに登録されているミドルウェアをパイプラインに追加することもできます。

sourceを参照してください。

AutofacからOWINパイプライン(つまりミドルウェア)に何かを注入する場合は、この行が必要です。しかし、あなたのシナリオでは、そういうことをしないように見えるので、その行を削除しても何も変わりません。

OWINパイプラインからオブジェクトを解決する場合、実際にはこれを行う必要はありません。すでにオブジェクトをAutofacから解決しています。あなたはまだOWINに登録する必要があるのでしかし、SecurityStampValidatorはまだ、OWINからApplicationUserManagerを解決します

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>()); 

は、その背後にある理由のためthis question/answerを参照してください。

+0

さて、それは私にはある意味があります。私がそれをテストするには、私のOWINミドルウェア言語モジュールをapp.UseAutofacMiddleware()呼び出しの有無にかかわらずチェックする必要があります。これは、サイトに必要な言語に基づいてスレッドカルチャを切り替えるために、AutofacでOWINミドルウェア層を使用します。私はそれがその行なしで失敗するのを見るべきです。私は今夜​​テストします!説明をありがとうございます。 – Gareth

+1

私の前のコメントにちょうどさらに。だから私はラインと私のミドルウェアはまだ正常に動作するとコメントした。しかし、私は、AutofacでWebFormsを使用していて、自分のGlobal.asax.csファイルにIContainerProviderAccessorを実装していて、自分のミドルウェアで私のDIを解決するためにAutofacのBeginLifetimeScope()メソッド(私のGlobal.asax.csクラス経由)オブジェクト。 したがって、私はapp.UseAutofacMiddleware()コールは必要ありません。 – Gareth

+0

@ガースは意味をなさない。あなたはそれの底に落ちた良いもの! – trailmax

関連する問題