私は再利用したい認証プロジェクトを持っています。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>
}
}
ジェネリックコントローラーをベースコントローラーにする – Nkosi
そして、ベースコントローラータイプのパラメーターとして何を渡す必要がありますか? – jwize
プロジェクトを使用しているアプリケーションユーザー – Nkosi