mirror of
https://github.com/bitwarden/server.git
synced 2025-04-08 06:28:14 -05:00
remember two factor token
This commit is contained in:
parent
c069fad4e7
commit
15dcb43f44
@ -6,6 +6,7 @@
|
|||||||
Email = 1,
|
Email = 1,
|
||||||
Duo = 2,
|
Duo = 2,
|
||||||
YubiKey = 3,
|
YubiKey = 3,
|
||||||
U2f = 4
|
U2f = 4,
|
||||||
|
Remember = 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
21
src/Core/Identity/TwoFactorRememberTokenProvider.cs
Normal file
21
src/Core/Identity/TwoFactorRememberTokenProvider.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
using Bit.Core.Models.Table;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Microsoft.AspNetCore.DataProtection;
|
||||||
|
|
||||||
|
namespace Bit.Core.Identity
|
||||||
|
{
|
||||||
|
public class TwoFactorRememberTokenProvider : DataProtectorTokenProvider<User>
|
||||||
|
{
|
||||||
|
private readonly GlobalSettings _globalSettings;
|
||||||
|
|
||||||
|
public TwoFactorRememberTokenProvider(
|
||||||
|
IDataProtectionProvider dataProtectionProvider,
|
||||||
|
IOptions<TwoFactorRememberTokenProviderOptions> options)
|
||||||
|
: base(dataProtectionProvider, options)
|
||||||
|
{ }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TwoFactorRememberTokenProviderOptions : DataProtectionTokenProviderOptions
|
||||||
|
{ }
|
||||||
|
}
|
@ -38,6 +38,7 @@ namespace Bit.Core.IdentityServer
|
|||||||
{
|
{
|
||||||
var twoFactorToken = context.Request.Raw["TwoFactorToken"]?.ToString();
|
var twoFactorToken = context.Request.Raw["TwoFactorToken"]?.ToString();
|
||||||
var twoFactorProvider = context.Request.Raw["TwoFactorProvider"]?.ToString();
|
var twoFactorProvider = context.Request.Raw["TwoFactorProvider"]?.ToString();
|
||||||
|
var twoFactorRemember = context.Request.Raw["TwoFactorRemember"]?.ToString() == "1";
|
||||||
var twoFactorRequest = !string.IsNullOrWhiteSpace(twoFactorToken) && !string.IsNullOrWhiteSpace(twoFactorProvider);
|
var twoFactorRequest = !string.IsNullOrWhiteSpace(twoFactorToken) && !string.IsNullOrWhiteSpace(twoFactorProvider);
|
||||||
|
|
||||||
if(!string.IsNullOrWhiteSpace(context.UserName))
|
if(!string.IsNullOrWhiteSpace(context.UserName))
|
||||||
@ -63,7 +64,8 @@ namespace Bit.Core.IdentityServer
|
|||||||
if(!twoFactorRequest || await VerifyTwoFactor(user, twoFactorProviderType, twoFactorToken))
|
if(!twoFactorRequest || await VerifyTwoFactor(user, twoFactorProviderType, twoFactorToken))
|
||||||
{
|
{
|
||||||
var device = await SaveDeviceAsync(user, context);
|
var device = await SaveDeviceAsync(user, context);
|
||||||
BuildSuccessResult(user, context, device);
|
await BuildSuccessResultAsync(user, context, device, twoFactorRequest,
|
||||||
|
twoFactorProviderType, twoFactorRemember);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,7 +76,8 @@ namespace Bit.Core.IdentityServer
|
|||||||
BuildErrorResult(twoFactorRequest, context);
|
BuildErrorResult(twoFactorRequest, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BuildSuccessResult(User user, ResourceOwnerPasswordValidationContext context, Device device)
|
private async Task BuildSuccessResultAsync(User user, ResourceOwnerPasswordValidationContext context, Device device,
|
||||||
|
bool twoFactorRequest, TwoFactorProviderType twoFactorProviderType, bool twoFactorRemember)
|
||||||
{
|
{
|
||||||
var claims = new List<Claim>();
|
var claims = new List<Claim>();
|
||||||
|
|
||||||
@ -94,6 +97,12 @@ namespace Bit.Core.IdentityServer
|
|||||||
customResponse.Add("Key", user.Key);
|
customResponse.Add("Key", user.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(twoFactorRequest && twoFactorRemember)
|
||||||
|
{
|
||||||
|
var token = await _userManager.GenerateTwoFactorTokenAsync(user, TwoFactorProviderType.Remember.ToString());
|
||||||
|
customResponse.Add("TwoFactorToken", token);
|
||||||
|
}
|
||||||
|
|
||||||
context.Result = new GrantValidationResult(user.Id.ToString(), "Application",
|
context.Result = new GrantValidationResult(user.Id.ToString(), "Application",
|
||||||
identityProvider: "bitwarden",
|
identityProvider: "bitwarden",
|
||||||
claims: claims.Count > 0 ? claims : null,
|
claims: claims.Count > 0 ? claims : null,
|
||||||
@ -167,6 +176,7 @@ namespace Bit.Core.IdentityServer
|
|||||||
case TwoFactorProviderType.Duo:
|
case TwoFactorProviderType.Duo:
|
||||||
case TwoFactorProviderType.YubiKey:
|
case TwoFactorProviderType.YubiKey:
|
||||||
case TwoFactorProviderType.U2f:
|
case TwoFactorProviderType.U2f:
|
||||||
|
case TwoFactorProviderType.Remember:
|
||||||
return await _userManager.VerifyTwoFactorTokenAsync(user, type.ToString(), token);
|
return await _userManager.VerifyTwoFactorTokenAsync(user, type.ToString(), token);
|
||||||
case TwoFactorProviderType.Email:
|
case TwoFactorProviderType.Email:
|
||||||
return await _userService.VerifyTwoFactorEmailAsync(user, token);
|
return await _userService.VerifyTwoFactorEmailAsync(user, token);
|
||||||
|
@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Identity;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.WindowsAzure.Storage;
|
using Microsoft.WindowsAzure.Storage;
|
||||||
|
using System;
|
||||||
using SqlServerRepos = Bit.Core.Repositories.SqlServer;
|
using SqlServerRepos = Bit.Core.Repositories.SqlServer;
|
||||||
|
|
||||||
namespace Bit.Core.Utilities
|
namespace Bit.Core.Utilities
|
||||||
@ -71,6 +72,11 @@ namespace Bit.Core.Utilities
|
|||||||
{
|
{
|
||||||
services.AddTransient<ILookupNormalizer, LowerInvariantLookupNormalizer>();
|
services.AddTransient<ILookupNormalizer, LowerInvariantLookupNormalizer>();
|
||||||
|
|
||||||
|
services.Configure<TwoFactorRememberTokenProviderOptions>(options =>
|
||||||
|
{
|
||||||
|
options.TokenLifespan = TimeSpan.FromDays(30);
|
||||||
|
});
|
||||||
|
|
||||||
var identityBuilder = services.AddIdentity<User, Role>(options =>
|
var identityBuilder = services.AddIdentity<User, Role>(options =>
|
||||||
{
|
{
|
||||||
options.User = new UserOptions
|
options.User = new UserOptions
|
||||||
@ -102,6 +108,7 @@ namespace Bit.Core.Utilities
|
|||||||
.AddTokenProvider<YubicoOtpTokenProvider>(TwoFactorProviderType.YubiKey.ToString())
|
.AddTokenProvider<YubicoOtpTokenProvider>(TwoFactorProviderType.YubiKey.ToString())
|
||||||
.AddTokenProvider<DuoWebTokenProvider>(TwoFactorProviderType.Duo.ToString())
|
.AddTokenProvider<DuoWebTokenProvider>(TwoFactorProviderType.Duo.ToString())
|
||||||
.AddTokenProvider<U2fTokenProvider>(TwoFactorProviderType.U2f.ToString())
|
.AddTokenProvider<U2fTokenProvider>(TwoFactorProviderType.U2f.ToString())
|
||||||
|
.AddTokenProvider<TwoFactorRememberTokenProvider>(TwoFactorProviderType.Remember.ToString())
|
||||||
.AddTokenProvider<EmailTokenProvider<User>>(TokenOptions.DefaultEmailProvider);
|
.AddTokenProvider<EmailTokenProvider<User>>(TokenOptions.DefaultEmailProvider);
|
||||||
|
|
||||||
return identityBuilder;
|
return identityBuilder;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user