如何使用 Microsoft 标识框架从基本 C# 基本项目中抽象依赖类型?



我有一个想要重用的身份验证项目。

我有一个名为身份验证的AspNetCore Identity项目,该项目旨在成为一个可重用的身份验证项目。如果您查看了 AspNetCore Identity 实现,您将看到一个名为 UserManager 的类型,其中应用程序用户是将用户实现存储在 AspNetUsers 数据库表中的类。

public class ApplicationUser : IdentityUser
{
}

我遇到的问题是,在这个隔离的身份验证项目中有一个名为AccountController的控制器,它保存所有登录/注销,注册和其他相关帐户操作。我希望将应用程序用户从该项目的类中抽象出来,以便我可以根据项目对多个解决方案的需求对其进行更改。

身份验证项目有一个启动类,该启动类从使用它的项目内启动如下:

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

如您所见,订阅项目添加了自己的应用程序用户实现。接下来,是标识的配置,该标识在服务中引用了 TApplicationUser。添加标识调用。

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

不幸的是,这现在在使用注入服务的帐户控制器中崩溃了。如何,是否可以将应用程序用户添加到控制器中。

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;
}
} 

无论如何,是否仍然可以使用包含的类型参数解析应用程序控制器?

而且,我还发现了另一个问题,即即使我在基类中添加了类型参数,我如何能够在使用 TApplicationUser 的视图中添加类型参数。这是一个例子

嵌入在身份验证项目中的视图

@* 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>
}
}

将泛型控制器作为可重用项目中的基本控制器

public abstract class AccountControllerBase<TApplicationUser> : Controller 
where TApplicationUser : IdentityUser {
protected readonly UserManager<TApplicationUser> _userManager;
protected AccountController(UserManager<TApplicationUser> userManager) {
_userManager = userManager;
}
}

using 类/项目将从基本控制器派生并定义泛型参数

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

相关内容

  • 没有找到相关文章

最新更新