Files
PixelTalk/web/web.PixelTalk/web.PixelTalk/Program.cs
T

75 lines
2.6 KiB
C#

using BlazorApp1.Components;
using Microsoft.AspNetCore.Authentication.Cookies;
using MongoDB.Driver;
using web.PixelTalk.Services;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/auth";
options.Cookie.Name = "PixelTalkAuth";
});
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddHttpContextAccessor();
builder.Services.AddSingleton<IMongoClient>(sp =>
{
var connectionString = builder.Configuration.GetConnectionString("MongoDb");
return new MongoClient(connectionString ?? "mongodb://witteringgray:27017");
});
builder.Services.AddSingleton<MongoService>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePagesWithReExecute("/not-found");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapGet("/login_callback", async (string code, web.PixelTalk.Services.MongoService mongoService, HttpContext context) =>
{
var req = await mongoService.AuthRequests.Find(r => r.Code == code && r.Resolved == true).FirstOrDefaultAsync();
if (req != null && !string.IsNullOrEmpty(req.Uuid))
{
Console.WriteLine(req.Uuid);
var player = await mongoService.Players.Find(p => p.Uuid == req.Uuid).FirstOrDefaultAsync();
var claims = new List<System.Security.Claims.Claim>
{
new(System.Security.Claims.ClaimTypes.NameIdentifier, req.Uuid),
new(System.Security.Claims.ClaimTypes.Name, player?.Nickname ?? req.Uuid)
};
if (player?.Role == "op")
{
claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "op"));
}
var identity = new System.Security.Claims.ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new System.Security.Claims.ClaimsPrincipal(identity);
await Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.SignInAsync(context, CookieAuthenticationDefaults.AuthenticationScheme, principal);
return Results.Redirect("/");
}
return Results.Redirect("/auth");
});
app.Run();