identity fixes

This commit is contained in:
2022-12-09 14:40:02 +01:00
parent 83772043e6
commit 27ab29728f
7 changed files with 51 additions and 29 deletions
@@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace zero.Raven;
public static class IdentityBuilderExtensions
{
/// <summary>
/// Adds a RavenDb implementation of identity information stores.
/// </summary>
public static IdentityBuilder AddRavenDbStores(this IdentityBuilder builder)
{
Type userStoreType = typeof(RavenUserStore<,>).MakeGenericType(builder.UserType, builder.RoleType);
Type roleStoreType = typeof(RavenRoleStore<>).MakeGenericType(builder.RoleType);
builder.Services.TryAddScoped(typeof(IUserStore<>).MakeGenericType(builder.UserType), userStoreType);
builder.Services.TryAddScoped(typeof(IRoleStore<>).MakeGenericType(builder.RoleType), roleStoreType);
return builder;
}
}
+8 -4
View File
@@ -125,7 +125,7 @@ public partial class RavenUserStore<TUser> :
return IdentityResult.Failed(new IdentityError
{
Code = "UserNotFound",
Description = $"Could not find stored user with id {user.Id}."
Description = $"Could not find stored user with id {user.Id}"
});
}
@@ -440,9 +440,13 @@ public partial class RavenUserStore<TUser> :
/// <inheritdoc />
public Task SetTokenAsync(TUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
{
UserToken token = user.Tokens.FirstOrDefault(x =>
x.LoginProvider.Equals(loginProvider, _comparer) && x.Name.Equals(name, _comparer))
?? new() { LoginProvider = loginProvider, Name = name };
UserToken token = user.Tokens.FirstOrDefault(x => x.LoginProvider.Equals(loginProvider, _comparer) && x.Name.Equals(name, _comparer));
if (token == null)
{
token = new() { LoginProvider = loginProvider, Name = name };
user.Tokens.Add(token);
}
token.Value = value;
@@ -25,7 +25,7 @@ public partial class RavenOperations : IRavenOperations
// check if the Id for a model already exists
if (!model.Id.IsNullOrEmpty())
{
using (IZeroDocumentSession session = Store.Session(options: new Rv.Documents.Session.SessionOptions() { Database = Store.ResolvedDatabase, NoCaching = true }))
using (IZeroDocumentSession session = Store.Session(options: new Rv.Documents.Session.SessionOptions() { NoCaching = true }))
{
previousModel = await session.LoadAsync<T>(model.Id);
}
+13 -23
View File
@@ -13,18 +13,7 @@ public class ZeroStore : IZeroStore
protected IZeroOptions Options { get; set; }
protected Dictionary<string, IZeroDocumentSession> ScopedSessions { get; set; } = new();
/// <inheritdoc />
string _resolvedDatabase = null;
public string ResolvedDatabase
{
get => _resolvedDatabase;
set
{
_resolvedDatabase = value;
Raven.ResolvedDatabase = value;
}
}
private const string NullDb = "__default__";
/// <inheritdoc />
@@ -34,25 +23,31 @@ public class ZeroStore : IZeroStore
/// <inheritdoc />
public IZeroDocumentSession Session(string database = null, ZeroSessionResolution resolution = ZeroSessionResolution.Reuse, SessionOptions options = null)
{
database ??= ResolvedDatabase;
options ??= new SessionOptions() { Database = database };
string databaseKey = database ?? NullDb;
options ??= new SessionOptions();
if (database.HasValue())
{
options.Database = database;
}
if (resolution == ZeroSessionResolution.Create)
{
return Raven.OpenAsyncSession(options) as IZeroDocumentSession;
}
if (!ScopedSessions.TryGetValue(database, out IZeroDocumentSession session))
if (!ScopedSessions.TryGetValue(databaseKey, out IZeroDocumentSession session))
{
session = Raven.OpenAsyncSession(options) as IZeroDocumentSession;
ScopedSessions.TryAdd(database, session);
ScopedSessions.TryAdd(databaseKey, session);
}
if (session.IsDisposed)
{
session = Raven.OpenAsyncSession(options) as IZeroDocumentSession;
ScopedSessions.Remove(database);
ScopedSessions.TryAdd(database, session);
ScopedSessions.Remove(databaseKey);
ScopedSessions.TryAdd(databaseKey, session);
}
return session;
@@ -69,11 +64,6 @@ public enum ZeroSessionResolution
public interface IZeroStore
{
/// <summary>
/// The database which has been resolved from the current application
/// </summary>
string ResolvedDatabase { get; set; }
/// <summary>
/// Get underlying raven document store
/// </summary>
+6
View File
@@ -19,6 +19,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "legacy", "legacy", "{93A1CC
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "zero.Raven", "zero.Raven\zero.Raven.csproj", "{DC79D7EA-FAA1-4701-9C36-8295CD1C45D0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "zero.Raven.IdentityDemo", "..\playground\zero.Raven.IdentityDemo\zero.Raven.IdentityDemo.csproj", "{05C829D6-3052-40DB-9282-3BDFCDAE0F05}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -49,6 +51,10 @@ Global
{DC79D7EA-FAA1-4701-9C36-8295CD1C45D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DC79D7EA-FAA1-4701-9C36-8295CD1C45D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC79D7EA-FAA1-4701-9C36-8295CD1C45D0}.Release|Any CPU.Build.0 = Release|Any CPU
{05C829D6-3052-40DB-9282-3BDFCDAE0F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{05C829D6-3052-40DB-9282-3BDFCDAE0F05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{05C829D6-3052-40DB-9282-3BDFCDAE0F05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{05C829D6-3052-40DB-9282-3BDFCDAE0F05}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
+1 -1
View File
@@ -29,7 +29,7 @@ public class ZeroEntity : ZeroIdEntity, ISupportsDbConventions, ISupportsRouting
/// <summary>
/// Whether the entity is visible in the frontend
/// </summary>
public bool IsActive { get; set; }
public bool IsActive { get; set; } = true;
/// <summary>
/// Unique hash for this entity (primarily used for routing)