Files
YandexMusic/PlaylistShared/Program.cs
2026-04-11 15:41:24 +03:00

79 lines
2.8 KiB
C#

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using PlaylistShared.Data.Contexts;
using PlaylistShared.Data.Entities;
using PlaylistShared.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection"));
});
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
builder.Services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Login";
options.LogoutPath = "/Logout";
options.AccessDeniedPath = "/AccessDenied";
});
builder.Services.AddAuthentication()
.AddOAuth("Yandex", options =>
{
options.ClientId = builder.Configuration["YandexOAuth:ClientId"];
options.ClientSecret = builder.Configuration["YandexOAuth:ClientSecret"];
options.AuthorizationEndpoint = builder.Configuration["YandexOAuth:AuthorizationEndpoint"];
options.TokenEndpoint = builder.Configuration["YandexOAuth:TokenEndpoint"];
options.UserInformationEndpoint = builder.Configuration["YandexOAuth:UserInfoEndpoint"];
options.CallbackPath = "/signin-yandex";
options.ClaimActions.MapJsonKey("urn:yandex:avatar_url", "avatar_url");
options.ClaimActions.MapJsonKey("urn:yandex:display_name", "display_name");
options.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents
{
OnCreatingTicket = async context =>
{
var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", context.AccessToken);
var response = await context.Backchannel.SendAsync(request);
response.EnsureSuccessStatusCode();
var user = System.Text.Json.JsonDocument.Parse(await response.Content.ReadAsStringAsync());
context.RunClaimActions(user.RootElement);
}
};
});
builder.Services.AddScoped<IYandexMusicService, YandexMusicService>();
builder.Services.AddHttpClient();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();