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
的事情,只是让 CreateAsync
和 Register
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);
}
}
我正在使用各种资源尝试使用 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
的事情,只是让 CreateAsync
和 Register
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);
}
}