Added LoginController for 3rd party apps to sign in

pull/7950/head
Alper Ebicoglu 7 years ago
parent 6be5147332
commit 44a0282408

@ -0,0 +1,103 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Volo.Abp.Account.Web.Areas.Account.Controllers.Models;
using Volo.Abp.Account.Web.Localization;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Identity;
using UserLoginInfo = Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo;
namespace Volo.Abp.Account.Web.Areas.Account.Controllers
{
[RemoteService]
[Controller]
[ControllerName("Login")]
[Area("Account")]
[Route("api/account/login")]
public class LoginController : AbpController
{
private readonly SignInManager<IdentityUser> _signInManager;
public IStringLocalizer<AccountResource> L { get; set; }
public string AspNetCoreIdentityCookieName = ".AspNetCore." + IdentityConstants.ApplicationScheme;
public LoginController(SignInManager<IdentityUser> signInManager)
{
_signInManager = signInManager;
}
[HttpPost]
[Route("")]
public virtual async Task<IActionResult> Login(UserLoginInfo login)
{
if (login == null)
{
throw new ArgumentException(nameof(login));
}
if (login.UserNameOrEmailAddress.IsNullOrEmpty())
{
throw new ArgumentNullException(nameof(login.UserNameOrEmailAddress));
}
if (login.Password.IsNullOrEmpty())
{
throw new ArgumentNullException(nameof(login.Password));
}
var result = await _signInManager.PasswordSignInAsync(
login.UserNameOrEmailAddress,
login.Password,
login.RememberMe,
true
);
if (result.IsLockedOut)
{
return Json(new AbpLoginResult(LoginResultType.LockedOut));
}
if (result.RequiresTwoFactor)
{
return Json(new AbpLoginResult(LoginResultType.RequiresTwoFactor));
}
if (result.IsNotAllowed)
{
return Json(new AbpLoginResult(LoginResultType.NotAllowed));
}
if (!result.Succeeded)
{
return Json(new AbpLoginResult(LoginResultType.InvalidUserNameOrPassword));
}
return Json(new AbpLoginResult(LoginResultType.Success)
{
IdentityCookieToken = GetCookieValueFromResponse(AspNetCoreIdentityCookieName) //todo: cookie name can be retrieved from UseAuthentication options
});
}
private string GetCookieValueFromResponse(string cookieName)
{
foreach (var headers in Response.Headers.Values)
{
foreach (var header in headers)
{
if (!header.StartsWith($"{cookieName}="))
{
continue;
}
var p1 = header.IndexOf('=');
var p2 = header.IndexOf(';');
return header.Substring(p1 + 1, p2 - p1 - 1);
}
}
return null;
}
}
}

@ -0,0 +1,18 @@
using Volo.Abp.Account.Web.Areas.Account.Controllers.Models;
namespace Volo.Abp.Account.Web.Areas.Account.Controllers
{
public class AbpLoginResult
{
public AbpLoginResult(LoginResultType result)
{
Result = result;
}
public string IdentityCookieToken { get; set; }
public LoginResultType Result { get; }
public string Description => Result.ToString();
}
}

@ -0,0 +1,15 @@
namespace Volo.Abp.Account.Web.Areas.Account.Controllers.Models
{
public enum LoginResultType : byte
{
Success = 1,
InvalidUserNameOrPassword = 2,
NotAllowed = 3,
LockedOut = 4,
RequiresTwoFactor = 5
}
}

@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations;
namespace Volo.Abp.Account.Web.Areas.Account.Controllers.Models
{
public class UserLoginInfo
{
[Required]
[StringLength(255)]
public string UserNameOrEmailAddress { get; set; }
[Required]
[StringLength(32)]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
}
Loading…
Cancel
Save