Changes on Database for Rolebased Users also started with Login Cookies.

This commit is contained in:
2025-07-05 00:15:51 +02:00
parent c385ee0628
commit 1152bc4f7e
11 changed files with 575 additions and 250 deletions

View File

@@ -1,17 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace WatchLog.Data
{
public class Admin
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(100)]
public required string Name { get; set; }
[Required]
public required string PasswordHash { get; set; } // Important: Save as HASH
}
}

View File

@@ -34,7 +34,7 @@ namespace WatchLog.Data
public virtual Type Type { get; set; } = null!;
[ForeignKey(nameof(CreatorId))]
public virtual User User { get; set; } = null!;
public virtual AppUser User { get; set; } = null!;
public virtual ICollection<LinkTableGlobalGenre> LinkTableGlobalGenres { get; set; } = new List<LinkTableGlobalGenre>();

View File

@@ -1,32 +0,0 @@
using System.ComponentModel.DataAnnotations;
namespace WatchLog.Data
{
public class User
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(100)]
public required string Name { get; set; }
[MaxLength(255)]
public string? Email { get; set; }
[Required]
public required string PasswordHash { get; set; } // Important: Save as HASH
// --- Navigation Properties ---
public virtual ICollection<PrivateEntity> PrivateEntities { get; set; } = new List<PrivateEntity>();
public virtual ICollection<GlobalEntity> GlobalEntities { get; set; } = new List<GlobalEntity>();
public virtual ICollection<Label> Labels { get; set; } = new List<Label>();
public virtual ICollection<UserWatchStatus> UserWatchStatuses { get; set; } = new List<UserWatchStatus>();
public virtual ICollection<LinkTableSharedUser> LinkTableSharedUsers { get; set; } = new List<LinkTableSharedUser>();
}
}

View File

@@ -25,7 +25,7 @@ namespace WatchLog.Data
// --- Navigation Properties ---
[ForeignKey(nameof(CreatorId))]
public virtual User User { get; set; } = null!;
public virtual AppUser User { get; set; } = null!;
public virtual ICollection<LinkTablePrivateLabel> LinkTablePrivateLabels { get; set; } = new List<LinkTablePrivateLabel>();
}

View File

@@ -37,7 +37,7 @@ namespace WatchLog.Data
// --- Navigation Properties ---
[ForeignKey(nameof(UserId))]
public virtual User User { get; set; } = null!;
public virtual AppUser User { get; set; } = null!;
[ForeignKey(nameof(GlobalEntityId))]
public virtual GlobalEntity GlobalEntity { get; set; } = null!;

View File

@@ -31,7 +31,7 @@ namespace WatchLog.Data
// --- Navigation Properties ---
[ForeignKey(nameof(UserId))]
public virtual User User { get; set; } = null!;
public virtual AppUser User { get; set; } = null!;
public virtual ICollection<PrivateEntity> PrivateEntities { get; set; } = new List<PrivateEntity>();
}

View File

@@ -16,6 +16,6 @@ namespace WatchLog.Data
public virtual SharedList SharedList { get; set; } = null!;
[ForeignKey(nameof(UserId))]
public virtual User User { get; set; } = null!;
public virtual AppUser User { get; set; } = null!;
}
}

View File

@@ -19,13 +19,12 @@ namespace WatchLog.Data
//Note: Link Tables a commented out because Entity Framework creates the tables by itself
// Global
public DbSet<Admin> Admins { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<GlobalEntity> GlobalEntities { get; set; }
//public DbSet<LinkTableGlobalGenre> LinkTableGlobalGenres { get; set; }
public DbSet<StreamingPlatform> StreamingPlatforms { get; set; }
public DbSet<Type> Types { get; set; } // 'Watchlog.Data.Type' if namecolsion with System.Type
public DbSet<User> Users { get; set; }
public DbSet<AppUser> AppUsers { get; set; }
//Private
public DbSet<Label> Labels { get; set; }

View File

@@ -24,8 +24,26 @@ namespace WatchLog
builder.Services.AddHttpContextAccessor();
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
builder.Services.AddIdentityCore<AppUser>(options =>
{
// Hier könntest du Passwortregeln festlegen, z.B.
options.Password.RequireDigit = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequiredLength = 4; // Nur für Entwicklung!
})
.AddSignInManager() // Fügt den SignInManager hinzu, der den Login-Prozess steuert.
.AddDefaultTokenProviders(); // Nötig für Features wie Passwort-Reset.
// 2. Jetzt sagen wir Identity, welche Klassen es für seine Aufgaben verwenden soll.
// Dies ist der wichtigste Teil!
builder.Services.AddScoped<IUserStore<AppUser>, MyUserStore>();
builder.Services.AddScoped<IPasswordHasher<AppUser>, PasswordHasher<AppUser>>();
// 3. Da wir IdentityCore verwenden, müssen wir die Cookie-Authentifizierung selbst hinzufügen.
// Die Konfiguration ist fast identisch zu deiner alten, aber sie ist jetzt
// an das Identity-System gekoppelt.
builder.Services.AddAuthentication(IdentityConstants.ApplicationScheme)
.AddCookie(IdentityConstants.ApplicationScheme, options =>
{
options.Cookie.Name = "WatchLogAuthCookie";
options.LoginPath = "/login";
@@ -35,13 +53,12 @@ namespace WatchLog
options.SlidingExpiration = true;
});
// 4. Die Autorisierungs-Policy ist perfekt und bleibt genau so!
// Sie sorgt dafür, dass alle Seiten standardmäßig einen Login erfordern.
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
});
builder.Services.AddScoped<IPasswordHasher<User>, PasswordHasher<User>>();
builder.Services.AddScoped<IPasswordHasher<Admin>, PasswordHasher<Admin>>();
var app = builder.Build();