Replace custom socket implementation with SignalR.
Replace MSAL and custom cookie auth with Microsoft.Identity.EntityFramework Also some UI redesign to accommodate different login experience.
This commit is contained in:
@@ -1,66 +1,66 @@
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||
using Microsoft.AspNetCore.ResponseCompression;
|
||||
using Shogi.UI;
|
||||
using Shogi.UI.Pages.Home;
|
||||
using Shogi.UI.Pages.Home.Account;
|
||||
using Shogi.UI.Pages.Home.Api;
|
||||
using Shogi.UI.Identity;
|
||||
using Shogi.UI.Pages.Play;
|
||||
using Shogi.UI.Shared;
|
||||
using System.Text.Json;
|
||||
|
||||
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||
builder.RootComponents.Add<App>("#app");
|
||||
builder.RootComponents.Add<HeadOutlet>("head::after");
|
||||
builder.Logging.AddConfiguration(
|
||||
builder.Configuration.GetSection("Logging"));
|
||||
ConfigureDependencies(builder.Services, builder.Configuration);
|
||||
|
||||
builder.Services.AddResponseCompression(options =>
|
||||
{
|
||||
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(["application/octet-stream"]);
|
||||
});
|
||||
|
||||
await builder.Build().RunAsync();
|
||||
|
||||
static void ConfigureDependencies(IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
/**
|
||||
* Why two HTTP clients?
|
||||
* See qhttps://docs.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/additional-scenarios?source=recommendations&view=aspnetcore-6.0#unauthenticated-or-unauthorized-web-api-requests-in-an-app-with-a-secure-default-client
|
||||
*/
|
||||
var baseUrl = configuration["ShogiApiUrl"];
|
||||
if (string.IsNullOrWhiteSpace(baseUrl))
|
||||
{
|
||||
throw new InvalidOperationException("ShogiApiUrl configuration is missing.");
|
||||
}
|
||||
/**
|
||||
* Why two HTTP clients?
|
||||
* See qhttps://docs.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/additional-scenarios?source=recommendations&view=aspnetcore-6.0#unauthenticated-or-unauthorized-web-api-requests-in-an-app-with-a-secure-default-client
|
||||
*/
|
||||
var baseUrl = configuration["ShogiApiUrl"];
|
||||
if (string.IsNullOrWhiteSpace(baseUrl))
|
||||
{
|
||||
throw new InvalidOperationException("ShogiApiUrl configuration is missing.");
|
||||
}
|
||||
|
||||
var shogiApiUrl = new Uri(baseUrl, UriKind.Absolute);
|
||||
services
|
||||
.AddHttpClient(ShogiApi.MsalClientName, client => client.BaseAddress = shogiApiUrl)
|
||||
.AddHttpMessageHandler<MsalMessageHandler>();
|
||||
services
|
||||
.AddHttpClient(ShogiApi.GuestClientName, client => client.BaseAddress = shogiApiUrl)
|
||||
.AddHttpMessageHandler<CookieCredentialsMessageHandler>();
|
||||
var shogiApiUrl = new Uri(baseUrl, UriKind.Absolute);
|
||||
|
||||
// Authorization
|
||||
services.AddMsalAuthentication(options =>
|
||||
{
|
||||
configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
|
||||
options.ProviderOptions.LoginMode = "redirect";
|
||||
services
|
||||
.AddTransient<CookieCredentialsMessageHandler>()
|
||||
.AddTransient<ILocalStorage, LocalStorage>()
|
||||
.AddSingleton<PromotePrompt>();
|
||||
|
||||
});
|
||||
services.AddOidcAuthentication(options =>
|
||||
{
|
||||
// Configure your authentication provider options here.
|
||||
// For more information, see https://aka.ms/blazor-standalone-auth
|
||||
configuration.Bind("AzureAd", options.ProviderOptions);
|
||||
options.ProviderOptions.ResponseType = "code";
|
||||
});
|
||||
// Identity
|
||||
services
|
||||
.AddAuthorizationCore(options => options.AddPolicy("Admin", policy => policy.RequireUserName("Hauth@live.com")))
|
||||
.AddScoped<AuthenticationStateProvider, CookieAuthenticationStateProvider>()
|
||||
.AddScoped(sp => (IAccountManagement)sp.GetRequiredService<AuthenticationStateProvider>())
|
||||
.AddHttpClient("Auth", client => client.BaseAddress = shogiApiUrl) // "Auth" is the name expected by the auth library.
|
||||
.AddHttpMessageHandler<CookieCredentialsMessageHandler>();
|
||||
|
||||
// https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/dependency-injection?view=aspnetcore-6.0#service-lifetime
|
||||
services.AddScoped<AccountManager>();
|
||||
services.AddScoped<AccountState>();
|
||||
services.AddScoped<ShogiSocket>();
|
||||
services.AddScoped<ILocalStorage, LocalStorage>();
|
||||
services.AddScoped<MsalMessageHandler>();
|
||||
services.AddScoped<CookieCredentialsMessageHandler>();
|
||||
services.AddScoped<IShogiApi, ShogiApi>();
|
||||
services.AddScoped<PromotePrompt>();
|
||||
// Network clients
|
||||
services
|
||||
.AddHttpClient<ShogiApi>(client => client.BaseAddress = shogiApiUrl)
|
||||
.AddHttpMessageHandler<CookieCredentialsMessageHandler>();
|
||||
services
|
||||
.AddSingleton<GameHubNode>();
|
||||
|
||||
var serializerOptions = new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true
|
||||
};
|
||||
services.AddScoped((sp) => serializerOptions);
|
||||
|
||||
var serializerOptions = new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true
|
||||
};
|
||||
services.AddSingleton((sp) => serializerOptions);
|
||||
}
|
||||
Reference in New Issue
Block a user