ASP.NET 身份的自定义实现

Custom implementation of ASP.NET Identity

我正在使用各种资源尝试使用 MS Access 为 AngularJS 应用程序实施身份系统。 我创建了 classes 来实现我需要的身份接口,我停留在创建帐户控制器的阶段(这将是用于注册、登录等的 API)。

class UserStore 实现 IUserStore 并具有 CreateAsync 方法:

public Task CreateAsync(TUser user)
{
    if (user == null)
    {
        throw new ArgumentNullException("user");
    }

    var result = userTable.Insert(user);

    return Task.FromResult(result);
} 

AccountController 实现 ApiController 并具有 Register 方法:

[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
    var result = await _userStore.CreateAsync(user);

    if (result == 0)
    {
        return InternalServerError();
    }

    return Ok();
}

userTable.Insert(user) return 一个 int 表示数据库 table 中受影响的行数。 var result = await _userStore.CreateAsync(user); 行抛出一个错误,说它实际上是 returns void,因此 void 不能分配给 var(或其他任何东西)。

我很难理解如何编写 Register 方法和 CreateAsync 方法以便它们一起工作。

顺便说一句,我想我应该放弃整个 async 的事情,只是让 CreateAsyncRegister return 原样的 int 值,但我可以不要那样做,因为 UserStore 实现了 `IUserStore'。

问题是 return 类型无法从 CreateAsync 传递,因为它只是一个 Task return。它需要是 Task<int> 但你不能这样做,因为它正在实现 IUserStore 接口。为什么你需要结果,我假设你不需要?

试试这个:

[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
    await _userStore.CreateAsync(user);
    return Ok();
}

此外,如果可能的话,考虑进行 userTable.Insert(user) 调用 async

我建议不要放弃 async/await。特别是对于像这样的网站上的 I/O 绑定操作,它们确实使您的应用程序可用。

如果您真的担心插入是否有问题,请试试这个:

public async Task CreateAsync(TUser user)
{
    if (user == null)
    {
        throw new ArgumentNullException("user");
    }

    var existingUser = await this.FindByIdAsync(user.Id);
    if (existingUser != null)
    {
        await this.UpdateAsync(user);
    }
    else
    {
        userTable.Insert(user);
    }
}