新しい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);
誰かが正しい方向に向いていますか?
さて、それは私にはある意味があります。私がそれをテストするには、私のOWINミドルウェア言語モジュールをapp.UseAutofacMiddleware()呼び出しの有無にかかわらずチェックする必要があります。これは、サイトに必要な言語に基づいてスレッドカルチャを切り替えるために、AutofacでOWINミドルウェア層を使用します。私はそれがその行なしで失敗するのを見るべきです。私は今夜テストします!説明をありがとうございます。 – Gareth
私の前のコメントにちょうどさらに。だから私はラインと私のミドルウェアはまだ正常に動作するとコメントした。しかし、私は、AutofacでWebFormsを使用していて、自分のGlobal.asax.csファイルにIContainerProviderAccessorを実装していて、自分のミドルウェアで私のDIを解決するためにAutofacのBeginLifetimeScope()メソッド(私のGlobal.asax.csクラス経由)オブジェクト。 したがって、私はapp.UseAutofacMiddleware()コールは必要ありません。 – Gareth
@ガースは意味をなさない。あなたはそれの底に落ちた良いもの! – trailmax