通过poster从API到数据库的post请求给了我以下响应:{"消息":"对象名称"Accounts"无效"}
这些是我的C#代码,我不知道我做错了什么,也不知道我遗漏了什么。请帮忙。
-
AccountsController。
使用AutoMapper;使用Microsoft。AspNetCore。Http;使用Microsoft。AspNetCore。Mvc;使用系统;使用System。集合。通用的使用非洲生物数据测试。实体;使用非洲生物数据测试。模型。账户使用非洲生物数据测试。服务;
namespace Africanbiomedtests.Controllers { [ApiController] [Route("[controller]")] public class AccountsController : BaseController { private readonly IAccountService _accountService; private readonly IMapper _mapper; public AccountsController( IAccountService accountService, IMapper mapper) { _accountService = accountService; _mapper = mapper; } [HttpPost("authenticate")] public ActionResult<AuthenticateResponse> Authenticate(AuthenticateRequest model) { var response = _accountService.Authenticate(model, ipAddress()); setTokenCookie(response.RefreshToken); return Ok(response); } [HttpPost("refresh-token")] public ActionResult<AuthenticateResponse> RefreshToken() { var refreshToken = Request.Cookies["refreshToken"]; var response = _accountService.RefreshToken(refreshToken, ipAddress()); setTokenCookie(response.RefreshToken); return Ok(response); } [Authorize] [HttpPost("revoke-token")] public IActionResult RevokeToken(RevokeTokenRequest model) { // accept token from request body or cookie var token = model.Token ?? Request.Cookies["refreshToken"]; if (string.IsNullOrEmpty(token)) return BadRequest(new { message = "Token is required" }); // users can revoke their own tokens and admins can revoke any tokens if (!Account.OwnsToken(token) && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); _accountService.RevokeToken(token, ipAddress()); return Ok(new { message = "Token revoked" }); } [HttpPost("register")] public IActionResult Register(RegisterRequest model) { _accountService.Register(model, Request.Headers["origin"]); return Ok(new { message = "Registration successful, please check your email for verification instructions" }); } [HttpPost("verify-email")] public IActionResult VerifyEmail(VerifyEmailRequest model) { _accountService.VerifyEmail(model.Token); return Ok(new { message = "Verification successful, you can now login" }); } [HttpPost("forgot-password")] public IActionResult ForgotPassword(ForgotPasswordRequest model) { _accountService.ForgotPassword(model, Request.Headers["origin"]); return Ok(new { message = "Please check your email for password reset instructions" }); } [HttpPost("validate-reset-token")] public IActionResult ValidateResetToken(ValidateResetTokenRequest model) { _accountService.ValidateResetToken(model); return Ok(new { message = "Token is valid" }); } [HttpPost("reset-password")] public IActionResult ResetPassword(ResetPasswordRequest model) { _accountService.ResetPassword(model); return Ok(new { message = "Password reset successful, you can now login" }); } [Authorize(Role.Admin)] [HttpGet] public ActionResult<IEnumerable<AccountResponse>> GetAll() { var accounts = _accountService.GetAll(); return Ok(accounts); } [Authorize] [HttpGet("{id:int}")] public ActionResult<AccountResponse> GetById(int id) { // users can get their own account and admins can get any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); var account = _accountService.GetById(id); return Ok(account); } [Authorize(Role.Admin)] [HttpPost] public ActionResult<AccountResponse> Create(CreateRequest model) { var account = _accountService.Create(model); return Ok(account); } [Authorize] [HttpPut("{id:int}")] public ActionResult<AccountResponse> Update(int id, UpdateRequest model) { // users can update their own account and admins can update any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); // only admins can update role if (Account.Role != Role.Admin) model.Role = null; var account = _accountService.Update(id, model); return Ok(account); } [Authorize] [HttpDelete("{id:int}")] public IActionResult Delete(int id) { // users can delete their own account and admins can delete any account if (id != Account.Id && Account.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); _accountService.Delete(id); return Ok(new { message = "Account deleted successfully" }); } // helper methods private void setTokenCookie(string token) { var cookieOptions = new CookieOptions { HttpOnly = true, Expires = DateTime.UtcNow.AddDays(7) }; Response.Cookies.Append("refreshToken", token, cookieOptions); } private string ipAddress() { if (Request.Headers.ContainsKey("X-Forwarded-For")) return Request.Headers["X-Forwarded-For"]; else return HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } } }
2(。账户机密
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Africanbiomedtests.Entities
{
public class Account
{
public int Id { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
public bool AcceptTerms { get; set; }
public Role Role { get; set; }
public HealthcareProvider HealthcareProvider { get; set; }
public string VerificationToken { get; set; }
public DateTime? Verified { get; set; }
public bool IsVerified => Verified.HasValue || PasswordReset.HasValue;
public string ResetToken { get; set; }
public DateTime? ResetTokenExpires { get; set; }
public DateTime? PasswordReset { get; set; }
public DateTime Created { get; set; }
public DateTime? Updated { get; set; }
public List<RefreshToken> RefreshTokens { get; set; }
public bool OwnsToken(string token)
{
return this.RefreshTokens?.Find(x => x.Token == token) != null;
}
}
}
3( 。RegisterRequest模型
using System.ComponentModel.DataAnnotations;
namespace Africanbiomedtests.Models.Accounts
{
public class RegisterRequest
{
[Required]
public string Title { get; set; }
[Required]
[StringLength(30)]
[RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
public string FirstName { get; set; }
[Required]
[StringLength(30)]
[RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
public string LastName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[MinLength(6)]
public string Password { get; set; }
[Required]
[Compare("Password")]
public string ConfirmPassword { get; set; }
[Range(typeof(bool), "true", "true")]
public bool AcceptTerms { get; set; }
}
}
感谢John的帮助,我意识到我没有完成EF数据库迁移,所以故障出在我身上。完成了迁移,现在可以工作了。