gpt4 book ai didi

c# - 使用 MVC AccountController 登录 Android App

转载 作者:太空狗 更新时间:2023-10-29 13:52:13 25 4
gpt4 key购买 nike

我正在开发一个移动应用程序(在 Android 中),它必须连接到 Azure 数据库(该数据库也被该应用程序的 Web 版本使用)。我使用 HttpURLConnection 成功地将 POST/PUT/GET 请求发送到 Web 服务 API,现在我正在尝试使用 MVC AccountController 登录应用程序。
这是我尝试调用的 MVC AccountController 方法:

    // POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning(2, "User account locked out.");
return View("Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}

// If we got this far, something failed, redisplay form
return View(model);
}

这是 LoginViewModel 结构(登录方法的第一个参数)

public class LoginViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; }

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}

这是我已经尝试过的,但我收到了:Bad request

public static String apiURL = "http://mysite/account/login";

public static String logIn() {
HttpURLConnection connection = null;

try {
URL url = new URL(apiURL);
JSONObject postDataParams = new JSONObject();
postDataParams.put("Email", "test@yahoo.com");
postDataParams.put("Password", "mypass");
postDataParams.put("RememberMe", true);

JSONObject finalJson = new JSONObject();
finalJson.put("model", postDataParams);
finalJson.put("returnUrl", "");

connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(15000);
connection.setConnectTimeout(15000);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/json");
connection.setDoInput(true);
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
out.write(finalJson.toString());
out.close();
System.out.println(finalJson.toString());
StringBuilder sb = new StringBuilder();
sb.append("");
int HttpResult = connection.getResponseCode();
if (HttpResult == HttpURLConnection.HTTP_OK) {
BufferedReader br = new BufferedReader(new InputStreamReader(
connection.getInputStream(), "utf-8"));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();

System.out.println("" + sb.toString());

} else {
System.out.println(connection.getResponseMessage());
}
return sb.toString();
} catch (Exception e) {
return new String("Exception: " + e.getMessage());
} finally {
connection.disconnect();
}
}

有人知道我该怎么做吗?谢谢!

最佳答案

我终于找到了解决方案,有人告诉我应该放弃使用网页版应用程序也使用的 LoginViewModel。所以我用一个新的资源写了一个新的 Controller ,它可以工作:这是 Controller 代码:

public class AccountMobileController : Controller
{
private readonly ApplicationDbContext context;
private readonly IMapper mapper;

private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IEmailSender _emailSender;
private readonly ISmsSender _smsSender;
private readonly ILogger _logger;
private readonly string _externalCookieScheme;

// POST api/mobilelogin
[AllowAnonymous]
[HttpPost("/api/mobilelogin")]
public async Task<IActionResult> Login([FromBody]LoginMobileResource model)
{
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
var user = context.Users.SingleOrDefault(c => c.Email == model.Email);
/* _logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);*/
var modeltoreturn = new LoginMobileResource
{
Status = "Ok",
Email = user.Email,
Password= "",
RememberMe = model.RememberMe,
UserId = user.Id
};
return Ok(modeltoreturn);
}
else
{
var modeltoreturn = new LoginMobileResource
{
Status = "Wrong password",
Email = model.Email,
Password = "",
UserId = ""
};
return Ok(modeltoreturn);
}
}
// If we got this far, something failed, redisplay form
model.Status = "Non-existent account";
return Ok(model);
}
}

这是我的 LoginMobileResource

public class LoginMobileResource
{
[Required]
[EmailAddress]
public string Email { get; set; }

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }

public String Status { get; set; }

public String UserId { get; set; }
}

Java 代码是一样的,只是现在我只发送 postDataParams

out.write(postDataParams.toString());

关于c# - 使用 MVC AccountController 登录 Android App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45274838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com