1

私は再利用したい認証プロジェクトを持っています。Microsoft IDフレームワークを使用してベースC#ベースプロジェクトから依存型を抽象化するにはどうすればよいですか?

私は再利用可能な認証プロジェクトを意図した認証と呼ばれるAspNetCore IDプロジェクトを持っています。 AspNetCore Identity実装を見た場合、UserManagerというタイプが表示されます。ここでは、アプリケーションユーザは、AspNetUsersデータベーステーブルにユーザの実装を格納するクラスです。

public class ApplicationUser : IdentityUser 
{ 
} 

私が午前問題は、登録、/アウトですべてのログを保持しているAccountControllerと呼ばれるこの分離された認証プロジェクトのコントローラ、およびその他の関連アカウントのアクションが存在することです。このプロジェクトのクラスからアプリケーションユーザーを抽象化して、複数のソリューションのプロジェクトのニーズに基づいて変更することができます。

認証プロジェクトは、それが使用されているプロジェクトの中から、次のように開始され、起動クラスがあります:あなたが見ることができるように

authenticationStartUp.ConfigureServices<ApplicationUser, MyDatabase> 
     (services, Configuration); 

を、サブスクライブしているプロジェクトはApplicationUserの独自の実装を追加します。次に、services.AddIdentityコールのTApplicationUserを参照するアイデンティティの設定が行われます。

public void ConfigureServices<TApplicationUser, TContext> 
      (IServiceCollection services, IConfigurationRoot Configuration) 
     where TApplicationUser : IdentityUser 
     where TContext : DbContext 
    { 
     services.AddIdentity<TApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<TContext>() 
      .AddDefaultTokenProviders(); 

残念ながら、これは注入されたサービスを使用しているAccountControllerで不幸になりました。どのようにTApplicationUserをコントローラに追加することができますか?

public class AccountController : Controller 
{ 
    private readonly UserManager<TApplicationUser> _userManager; 

    public AccountController(UserManager<TApplicationUser> userManager) 
    { 
     _userManager = userManager; 
    } 
} 

TApplicationUserが存在しないため、これは明らかに壊れています。さらに、次のようにTApplicationUserを追加すると、コントローラはそれ以上に解決されず何も起こりません。

public class AccountController<TApplicationUser> : Controller 
    where TApplicationUser : IdentityUser 
{ 
    private readonly UserManager<TApplicationUser> _userManager; 

    public AccountController(UserManager<TApplicationUser> userManager) 
    { 
     _userManager = userManager; 
    } 
} 

アプリケーションコントローラに含まれている型パラメータを使用して解決するにはどうしてですか?

また、基本クラスにtypeパラメータを追加しても、TApplicationUserを使用するビューでどのように型パラメータを追加できるようになるかという別の問題が見つかりました。ここで

public abstract class AccountControllerBase<TApplicationUser> : Controller 
    where TApplicationUser : IdentityUser { 
    protected readonly UserManager<TApplicationUser> _userManager; 

    protected AccountController(UserManager<TApplicationUser> userManager) { 
     _userManager = userManager; 
    } 
} 

使用してクラス/プロジェクトを導き出すだろう

ビューが

@* TApplicationUser obviously doesn't resolve *@ 
@inject SignInManager<TApplicationUser> SignInManager 
@{ 
    var loginProviders = SignInManager.GetExternalAuthenticationSchemes().ToList(); 
    if (loginProviders.Count == 0) 
    { 
     <div> 
      <p> 
       There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a> 
       for details on setting up this ASP.NET application to support logging in via external services. 
      </p> 
     </div> 
    } 
    else 
    { 
     <form asp-controller="Account" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal"> 
      <div> 
       <p> 
        @foreach (var provider in loginProviders) 
        { 
         <button type="submit" class="btn btn-default" name="provider" value="@provider.AuthenticationScheme" title="Log in using your @provider.DisplayName account">@provider.AuthenticationScheme</button> 
        } 
       </p> 
      </div> 
     </form> 
    } 
} 
+0

ジェネリックコントローラーをベースコントローラーにする – Nkosi

+0

そして、ベースコントローラータイプのパラメーターとして何を渡す必要がありますか? – jwize

+0

プロジェクトを使用しているアプリケーションユーザー – Nkosi

答えて

2

は、再利用可能なプロジェクトに住んでいるベースコントローラなどの一般的なコントローラをお持ちの認証プロジェクトに組み込まれた例でありますベースコントローラから取得して汎用引数を定義する

public class AccountController : AccountControllerBase<ApplicationUser> { 

    public AccountController(UserManager<ApplicationUser> userManager) 
     : base(userManager) { } 

} 
+0

これはうまくいきますが、RazorViewが@inject SignInManager <ここではタイプパラメータがない> SignInManagerを使用しているという点で小さな問題が1つあります。この制限を解決する方法はありますか?サインインマネージャーはビューで使用されているので、 – jwize

+0

あなたは私のためにその部分を明確にしなければなりません。なぜ、どのようにマネージャーがビューで使用されていますか?コントローラーはViewModelに値を設定し、それをビューに渡します。したがって、私はあなたが意味することについて完全にはっきりしません。 – Nkosi

+0

オリジナルの投稿をいくつかのコードで更新しました。このコードには、私が使用しているMicrosoft Identity実装が付属しています。 – jwize

関連する問題