没有实体框架的ASP.NET标识

Bre*_*ogt 8 .net c# asp.net asp.net-mvc asp.net-identity

是否可以在不使用实体框架的情况下使用新的ASP.NET标识,而是使用您自己的方法?

我有一个MVC项目,它使用普通的ADO.NET进行数据访问.我想实现ASP.NET标识,但我想继续使用ADO.NET和存储过程.这就是我选择的方式.

ry8*_*806 5

我对自己有类似的要求,并实现了ASP.NET身份框架的纯SQL Server版本.

我首先创建了一个示例项目(使用实体框架),然后观察它创建的表.然后我将它们移植到Visual Studio Sql Project.

接下来,我使用此链接提供有关哪些方法需要实现以及哪些方法与数据库交互的指导(注意:并非商店上的所有方法都应该/应该).链接上的代码是针对MySQL的,但让我对实现的内容有了很好的理解.

我仍然使用Sql为ASP.Net Identity Framework编写代码.因此,如果我在周末有时间,我会看到它的状态有多好并可能将其上传到github并在此处通过链接进行更新.

但与此同时,使用链接 - 它也提供了良好的学习体验!


Div*_*i G 5

我使用的是Asp.Net Identity 2.2.1.我实现这个的方法是创建自己的用户:

public class MyUser : IUser {...}
Run Code Online (Sandbox Code Playgroud)

然后创建我自己的UserStore :(实现您实现的接口所需的所有方法,并在这些方法上使用您的数据访问来拉/插入数据.例如,我创建了另一个dal类,我使用 dapper访问数据库,I提供了我的用户存储中的一个方法的示例,但它与您实现的所有其他方法的想法相同)

public class MyUserStore : IUserStore<MyUser>, IUserPasswordStore<MyUser>, IUserLockoutStore<MyUser, string>, IUserEmailStore<MyUser>
{
    public Task<MyUser> FindByNameAsync(string userName)
    { 
        MyUser muser = dal.FindByUsername(userName);

        if (muser != null)
            return Task.FromResult<User>(muser);

        return Task.FromResult<MyUser>(null);
    }
    //... all other methods
}
Run Code Online (Sandbox Code Playgroud)

然后我的dal.cs上的方法看起来像这样:

public MyUser FindByUsername(string username)
{
    //pull user from the database however you want to based on the username, 
    //in my case here is where I used Dapper to query the db and return the User object with the data on it, but you can do it however you want.

    return myUser; //object with data on it
}
Run Code Online (Sandbox Code Playgroud)

然后在我的UserManager上,我设置了这样的用户存储:

public UserManager() : base(new MyUserStore())
{
    //anything else you need on the constructor
}
Run Code Online (Sandbox Code Playgroud)

注意:并非MyUserStore上的所有方法都需要访问数据库,因为很多方法都调用FindUser ...方法或UpdateUser方法.例如:

public Task<int> IncrementAccessFailedCountAsync(MyUser user)
{
    //here I just updated the user object as I know that UpdateAsync() method will be called later.
    return Task.FromResult<int>(++user.FailedAttempts); 
}
Run Code Online (Sandbox Code Playgroud)