2015-07-01 17:07:29 +02:00
|
|
|
using System;
|
2015-07-23 12:03:50 +02:00
|
|
|
using System.Diagnostics;
|
2015-07-01 17:07:29 +02:00
|
|
|
using System.Security.Claims;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Microsoft.AspNet.Identity;
|
|
|
|
|
using Microsoft.AspNet.Identity.Owin;
|
|
|
|
|
using Microsoft.Owin;
|
2015-07-23 12:03:50 +02:00
|
|
|
using Microsoft.Owin.Logging;
|
2015-07-01 17:07:29 +02:00
|
|
|
using Microsoft.Owin.Security;
|
|
|
|
|
using Umbraco.Core.Configuration;
|
|
|
|
|
using Umbraco.Core.Models.Identity;
|
|
|
|
|
|
|
|
|
|
namespace Umbraco.Core.Security
|
|
|
|
|
{
|
|
|
|
|
public class BackOfficeSignInManager : SignInManager<BackOfficeIdentityUser, int>
|
|
|
|
|
{
|
2015-07-23 12:03:50 +02:00
|
|
|
private readonly ILogger _logger;
|
|
|
|
|
private readonly IOwinRequest _request;
|
|
|
|
|
|
2016-08-12 12:20:00 +02:00
|
|
|
public BackOfficeSignInManager(UserManager<BackOfficeIdentityUser, int> userManager, IAuthenticationManager authenticationManager, ILogger logger, IOwinRequest request)
|
2015-07-01 17:07:29 +02:00
|
|
|
: base(userManager, authenticationManager)
|
|
|
|
|
{
|
2015-07-23 12:03:50 +02:00
|
|
|
if (logger == null) throw new ArgumentNullException("logger");
|
|
|
|
|
if (request == null) throw new ArgumentNullException("request");
|
|
|
|
|
_logger = logger;
|
|
|
|
|
_request = request;
|
2015-07-01 17:07:29 +02:00
|
|
|
AuthenticationType = Constants.Security.BackOfficeAuthenticationType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override Task<ClaimsIdentity> CreateUserIdentityAsync(BackOfficeIdentityUser user)
|
|
|
|
|
{
|
|
|
|
|
return user.GenerateUserIdentityAsync((BackOfficeUserManager)UserManager);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 12:03:50 +02:00
|
|
|
public static BackOfficeSignInManager Create(IdentityFactoryOptions<BackOfficeSignInManager> options, IOwinContext context, ILogger logger)
|
2015-07-01 17:07:29 +02:00
|
|
|
{
|
2015-07-23 12:03:50 +02:00
|
|
|
return new BackOfficeSignInManager(
|
2016-08-12 12:20:00 +02:00
|
|
|
context.GetBackOfficeUserManager(),
|
2015-07-23 12:03:50 +02:00
|
|
|
context.Authentication,
|
|
|
|
|
logger,
|
|
|
|
|
context.Request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Sign in the user in using the user name and password
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="userName"/><param name="password"/><param name="isPersistent"/><param name="shouldLockout"/>
|
|
|
|
|
/// <returns/>
|
2016-07-12 13:36:08 +02:00
|
|
|
public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
|
2015-07-23 12:03:50 +02:00
|
|
|
{
|
|
|
|
|
var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);
|
|
|
|
|
|
|
|
|
|
switch (result)
|
|
|
|
|
{
|
|
|
|
|
case SignInStatus.Success:
|
2015-11-19 18:12:21 +01:00
|
|
|
_logger.WriteCore(TraceEventType.Information, 0,
|
|
|
|
|
string.Format(
|
|
|
|
|
"User: {0} logged in from IP address {1}",
|
|
|
|
|
userName,
|
|
|
|
|
_request.RemoteIpAddress), null, null);
|
2015-07-23 12:03:50 +02:00
|
|
|
break;
|
|
|
|
|
case SignInStatus.LockedOut:
|
|
|
|
|
_logger.WriteCore(TraceEventType.Information, 0,
|
|
|
|
|
string.Format(
|
|
|
|
|
"Login attempt failed for username {0} from IP address {1}, the user is locked",
|
|
|
|
|
userName,
|
|
|
|
|
_request.RemoteIpAddress), null, null);
|
|
|
|
|
break;
|
|
|
|
|
case SignInStatus.RequiresVerification:
|
|
|
|
|
_logger.WriteCore(TraceEventType.Information, 0,
|
|
|
|
|
string.Format(
|
|
|
|
|
"Login attempt failed for username {0} from IP address {1}, the user requires verification",
|
|
|
|
|
userName,
|
|
|
|
|
_request.RemoteIpAddress), null, null);
|
|
|
|
|
break;
|
|
|
|
|
case SignInStatus.Failure:
|
|
|
|
|
_logger.WriteCore(TraceEventType.Information, 0,
|
|
|
|
|
string.Format(
|
|
|
|
|
"Login attempt failed for username {0} from IP address {1}",
|
|
|
|
|
userName,
|
|
|
|
|
_request.RemoteIpAddress), null, null);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
2015-07-01 17:07:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates a user identity and then signs the identity using the AuthenticationManager
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="user"></param>
|
|
|
|
|
/// <param name="isPersistent"></param>
|
|
|
|
|
/// <param name="rememberBrowser"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public override async Task SignInAsync(BackOfficeIdentityUser user, bool isPersistent, bool rememberBrowser)
|
|
|
|
|
{
|
|
|
|
|
var userIdentity = await CreateUserIdentityAsync(user);
|
|
|
|
|
|
|
|
|
|
// Clear any partial cookies from external or two factor partial sign ins
|
|
|
|
|
AuthenticationManager.SignOut(
|
|
|
|
|
Constants.Security.BackOfficeExternalAuthenticationType,
|
|
|
|
|
Constants.Security.BackOfficeTwoFactorAuthenticationType);
|
|
|
|
|
|
|
|
|
|
var nowUtc = DateTime.Now.ToUniversalTime();
|
|
|
|
|
|
|
|
|
|
if (rememberBrowser)
|
|
|
|
|
{
|
|
|
|
|
var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id));
|
|
|
|
|
AuthenticationManager.SignIn(new AuthenticationProperties()
|
|
|
|
|
{
|
|
|
|
|
IsPersistent = isPersistent,
|
|
|
|
|
AllowRefresh = true,
|
|
|
|
|
IssuedUtc = nowUtc,
|
|
|
|
|
ExpiresUtc = nowUtc.AddMinutes(GlobalSettings.TimeOutInMinutes)
|
|
|
|
|
}, userIdentity, rememberBrowserIdentity);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
AuthenticationManager.SignIn(new AuthenticationProperties()
|
|
|
|
|
{
|
|
|
|
|
IsPersistent = isPersistent,
|
|
|
|
|
AllowRefresh = true,
|
|
|
|
|
IssuedUtc = nowUtc,
|
|
|
|
|
ExpiresUtc = nowUtc.AddMinutes(GlobalSettings.TimeOutInMinutes)
|
|
|
|
|
}, userIdentity);
|
|
|
|
|
}
|
2015-07-23 12:03:50 +02:00
|
|
|
|
|
|
|
|
_logger.WriteCore(TraceEventType.Information, 0,
|
|
|
|
|
string.Format(
|
|
|
|
|
"Login attempt succeeded for username {0} from IP address {1}",
|
|
|
|
|
user.UserName,
|
|
|
|
|
_request.RemoteIpAddress), null, null);
|
2015-07-01 17:07:29 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|