C# 从UI层抽象asp.net mvc标识

C# 从UI层抽象asp.net mvc标识,c#,asp.net-mvc,asp.net-identity,C#,Asp.net Mvc,Asp.net Identity,我正在构建一个新的MVC应用程序。通常,我的项目结构如下所示: public interface IAuthenticationService { bool VerifyPassword(User user, string password); bool SignIn(User user); void SignOut(); } DAL层(实体和存储库) 服务层(在api/前端和DAL之间协调的面向业务的服务调用) 前端,可以是web API或MVC应用程序 我的

我正在构建一个新的MVC应用程序。通常,我的项目结构如下所示:

public interface IAuthenticationService
{
    bool VerifyPassword(User user, string password);

    bool SignIn(User user);

    void SignOut();
}
  • DAL层(实体和存储库)
  • 服务层(在api/前端和DAL之间协调的面向业务的服务调用)
  • 前端,可以是web API或MVC应用程序
我的问题是,我总是以一个混乱的用户管理实现告终。我使用了成员资格提供程序,因此这一部分没有达到应有的效果。现在我看到了新的身份实现,我非常喜欢它。我对hot进行了一些搜索,将其抽象到后端,但没有结果

我找到了这篇关于构建项目的帖子,但没有给出真正的答案:


我希望有人能为我提供一些提示或技术文档,说明如何将所有登录和身份验证抽象到后端层。

您可以在业务层中创建一个非常基本的界面。它看起来像这样:

public interface IAuthenticationService
{
    bool VerifyPassword(User user, string password);

    bool SignIn(User user);

    void SignOut();
}
您可以在业务层、UI层或单独的基础结构层中使用ASP.NET标识实现此接口


此接口可以通过不同的技术实现,这些技术可以在运行时由IoC容器注册,例如,您可以在
AccountController
中使用该接口。因为身份验证框架往往会经常更改(每年左右),这使您可以更轻松地进行切换。

从技术上讲,它已经被抽象了。
UserManager
类是ASP.NET标识的核心,是围绕数据库上下文的包装器。现在,如果您要进一步抽象它,那么在代码中根本没有对ASP.NET标识的引用,我认为这是不必要的,但仍然是可能。您只需将所有代码移动到您的服务层,然后调用您的服务以点击
UserManager
上的相应方法。不过,您仍然需要传递上下文,这样您就不会创建多个实例,这肯定会咬到您。

但是,我该如何使用该属性呢在我的控制器中有什么以及如何实现oauth?@Patrick如果你指的是属性,你可以直接使用它,ASP.NET Identity将考虑它。它位于
System.Web.Mvc
命名空间中,因此它与身份验证实现没有直接的依赖关系。关于oauth,我没有使用它的经验,因此我不确定你是否使用它ould把它抽象出来。只是好奇有人真的做到了吗?听起来很简单,但由于EF标识实现在Account controller中包含的扩展方法,我所走的路线可能会造成如此混乱。我正试图达到一个点,我可以拉EF、标识和EF标识依赖关系完全来自我的MVC项目。我只是想看看是否有人有关于此/最佳实践的任何示例,因为我的示例很混乱,我可能必须重新启动。我不想在代码中删除asp.net标识。只想在MVC项目中删除它,并将其放在服务层项目中。也许我确实应该从移动所有代码开始从Controller到服务,然后看我接下来应该做什么。@Patrick如果将UserManager放在服务层,则必须从数据层传递dbContext(或IdbContext),这是错误的。您有解决方案吗?