172 lines
7.0 KiB
C#
172 lines
7.0 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Linq;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Options;
|
|
|
|
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
|
|
{
|
|
/// <summary>
|
|
/// Base class for the Entity Framework database context used for identity.
|
|
/// </summary>
|
|
/// <typeparam name="TUser">The type of the user objects.</typeparam>
|
|
public class IdentityUserContext<TUser> : IdentityUserContext<TUser, string> where TUser : IdentityUser
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of <see cref="IdentityUserContext{TUser}"/>.
|
|
/// </summary>
|
|
/// <param name="options">The options to be used by a <see cref="DbContext"/>.</param>
|
|
public IdentityUserContext(DbContextOptions options) : base(options) { }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="IdentityUserContext{TUser}" /> class.
|
|
/// </summary>
|
|
protected IdentityUserContext() { }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Base class for the Entity Framework database context used for identity.
|
|
/// </summary>
|
|
/// <typeparam name="TUser">The type of user objects.</typeparam>
|
|
/// <typeparam name="TKey">The type of the primary key for users and roles.</typeparam>
|
|
public class IdentityUserContext<TUser, TKey> : IdentityUserContext<TUser, TKey, IdentityUserClaim<TKey>, IdentityUserLogin<TKey>, IdentityUserToken<TKey>>
|
|
where TUser : IdentityUser<TKey>
|
|
where TKey : IEquatable<TKey>
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of the db context.
|
|
/// </summary>
|
|
/// <param name="options">The options to be used by a <see cref="DbContext"/>.</param>
|
|
public IdentityUserContext(DbContextOptions options) : base(options) { }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the class.
|
|
/// </summary>
|
|
protected IdentityUserContext() { }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Base class for the Entity Framework database context used for identity.
|
|
/// </summary>
|
|
/// <typeparam name="TUser">The type of user objects.</typeparam>
|
|
/// <typeparam name="TKey">The type of the primary key for users and roles.</typeparam>
|
|
/// <typeparam name="TUserClaim">The type of the user claim object.</typeparam>
|
|
/// <typeparam name="TUserLogin">The type of the user login object.</typeparam>
|
|
/// <typeparam name="TUserToken">The type of the user token object.</typeparam>
|
|
public abstract class IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken> : DbContext
|
|
where TUser : IdentityUser<TKey>
|
|
where TKey : IEquatable<TKey>
|
|
where TUserClaim : IdentityUserClaim<TKey>
|
|
where TUserLogin : IdentityUserLogin<TKey>
|
|
where TUserToken : IdentityUserToken<TKey>
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of the class.
|
|
/// </summary>
|
|
/// <param name="options">The options to be used by a <see cref="DbContext"/>.</param>
|
|
public IdentityUserContext(DbContextOptions options) : base(options) { }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the class.
|
|
/// </summary>
|
|
protected IdentityUserContext() { }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the <see cref="DbSet{TEntity}"/> of Users.
|
|
/// </summary>
|
|
public DbSet<TUser> Users { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the <see cref="DbSet{TEntity}"/> of User claims.
|
|
/// </summary>
|
|
public DbSet<TUserClaim> UserClaims { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the <see cref="DbSet{TEntity}"/> of User logins.
|
|
/// </summary>
|
|
public DbSet<TUserLogin> UserLogins { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the <see cref="DbSet{TEntity}"/> of User tokens.
|
|
/// </summary>
|
|
public DbSet<TUserToken> UserTokens { get; set; }
|
|
|
|
private int GetMaxLengthForKeys()
|
|
{
|
|
// Need to get the actual application service provider, fallback will cause
|
|
// options to not work since IEnumerable<IConfigureOptions> don't flow across providers
|
|
var options = this.GetService<IDbContextOptions>()
|
|
.Extensions.OfType<CoreOptionsExtension>()
|
|
.FirstOrDefault()?.ApplicationServiceProvider
|
|
?.GetService<IOptions<IdentityOptions>>()
|
|
?.Value?.Stores;
|
|
return options != null ? options.MaxLengthForKeys : 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configures the schema needed for the identity framework.
|
|
/// </summary>
|
|
/// <param name="builder">
|
|
/// The builder being used to construct the model for this context.
|
|
/// </param>
|
|
protected override void OnModelCreating(ModelBuilder builder)
|
|
{
|
|
var maxKeyLength = GetMaxLengthForKeys();
|
|
|
|
builder.Entity<TUser>(b =>
|
|
{
|
|
b.HasKey(u => u.Id);
|
|
b.HasIndex(u => u.NormalizedUserName).HasName("UserNameIndex").IsUnique();
|
|
b.HasIndex(u => u.NormalizedEmail).HasName("EmailIndex");
|
|
b.ToTable("AspNetUsers");
|
|
b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken();
|
|
|
|
b.Property(u => u.UserName).HasMaxLength(256);
|
|
b.Property(u => u.NormalizedUserName).HasMaxLength(256);
|
|
b.Property(u => u.Email).HasMaxLength(256);
|
|
b.Property(u => u.NormalizedEmail).HasMaxLength(256);
|
|
|
|
b.HasMany<TUserClaim>().WithOne().HasForeignKey(uc => uc.UserId).IsRequired();
|
|
b.HasMany<TUserLogin>().WithOne().HasForeignKey(ul => ul.UserId).IsRequired();
|
|
b.HasMany<TUserToken>().WithOne().HasForeignKey(ut => ut.UserId).IsRequired();
|
|
});
|
|
|
|
builder.Entity<TUserClaim>(b =>
|
|
{
|
|
b.HasKey(uc => uc.Id);
|
|
b.ToTable("AspNetUserClaims");
|
|
});
|
|
|
|
builder.Entity<TUserLogin>(b =>
|
|
{
|
|
b.HasKey(l => new { l.LoginProvider, l.ProviderKey });
|
|
|
|
if (maxKeyLength > 0)
|
|
{
|
|
b.Property(l => l.LoginProvider).HasMaxLength(maxKeyLength);
|
|
b.Property(l => l.ProviderKey).HasMaxLength(maxKeyLength);
|
|
}
|
|
|
|
b.ToTable("AspNetUserLogins");
|
|
});
|
|
|
|
builder.Entity<TUserToken>(b =>
|
|
{
|
|
b.HasKey(t => new { t.UserId, t.LoginProvider, t.Name });
|
|
|
|
if (maxKeyLength > 0)
|
|
{
|
|
b.Property(t => t.LoginProvider).HasMaxLength(maxKeyLength);
|
|
b.Property(t => t.Name).HasMaxLength(maxKeyLength);
|
|
}
|
|
|
|
b.ToTable("AspNetUserTokens");
|
|
});
|
|
}
|
|
}
|
|
} |