parent
99f3eeb2a4
commit
978e50acfb
@ -0,0 +1,24 @@ |
||||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
||||
|
||||
<PropertyGroup> |
||||
<TargetFramework>net8.0</TargetFramework> |
||||
<Nullable>enable</Nullable> |
||||
<ImplicitUsings>enable</ImplicitUsings> |
||||
</PropertyGroup> |
||||
|
||||
<ItemGroup> |
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.7" /> |
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.7"> |
||||
<PrivateAssets>all</PrivateAssets> |
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
||||
</PackageReference> |
||||
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components" Version="4.*-* " /> |
||||
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components.Emoji" Version="4.6.0" /> |
||||
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components.Icons" Version="4.*-* " /> |
||||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" /> |
||||
</ItemGroup> |
||||
|
||||
<ItemGroup> |
||||
<Folder Include="Components\Pages\Product\" /> |
||||
</ItemGroup> |
||||
</Project> |
@ -0,0 +1,67 @@ |
||||
using FluentPolicyAuth.Components; |
||||
using FluentPolicyAuth.Data; |
||||
using FluentPolicyAuth.Services; |
||||
using Microsoft.AspNetCore.Authentication.Cookies; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using Microsoft.FluentUI.AspNetCore.Components; |
||||
|
||||
namespace FluentPolicyAuth |
||||
{ |
||||
public class Program |
||||
{ |
||||
public static void Main(string[] args) |
||||
{ |
||||
var builder = WebApplication.CreateBuilder(args); |
||||
|
||||
// Add services to the container. |
||||
builder.Services.AddRazorComponents() |
||||
.AddInteractiveServerComponents(); |
||||
builder.Services.AddFluentUIComponents(); |
||||
|
||||
// For authentication |
||||
builder.Services.AddAuthorization(config => |
||||
{ |
||||
foreach (var userPolicy in Policy.GetPoilicies()) |
||||
config.AddPolicy(userPolicy, c => c.RequireClaim(userPolicy, "true")); |
||||
}); |
||||
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) |
||||
.AddCookie(options => |
||||
{ |
||||
options.Cookie.Name = "auth_token"; |
||||
options.LoginPath = "/login"; |
||||
options.Cookie.MaxAge = TimeSpan.FromMinutes(30); |
||||
options.AccessDeniedPath = "/access-denied"; |
||||
}); |
||||
builder.Services.AddCascadingAuthenticationState(); |
||||
|
||||
// For database |
||||
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); |
||||
builder.Services.AddDbContext<AppDbContext>(options => |
||||
{ |
||||
options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); |
||||
}); |
||||
|
||||
builder.Services.AddScoped<IUserService, UserService>(); |
||||
|
||||
var app = builder.Build(); |
||||
|
||||
// Configure the HTTP request pipeline. |
||||
if (!app.Environment.IsDevelopment()) |
||||
{ |
||||
app.UseExceptionHandler("/Error"); |
||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. |
||||
app.UseHsts(); |
||||
} |
||||
|
||||
app.UseHttpsRedirection(); |
||||
|
||||
app.UseStaticFiles(); |
||||
app.UseAntiforgery(); |
||||
|
||||
app.MapRazorComponents<App>() |
||||
.AddInteractiveServerRenderMode(); |
||||
|
||||
app.Run(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
{ |
||||
"$schema": "http://json.schemastore.org/launchsettings.json", |
||||
"iisSettings": { |
||||
"windowsAuthentication": false, |
||||
"anonymousAuthentication": true, |
||||
"iisExpress": { |
||||
"applicationUrl": "http://localhost:14060", |
||||
"sslPort": 44324 |
||||
} |
||||
}, |
||||
"profiles": { |
||||
"http": { |
||||
"commandName": "Project", |
||||
"dotnetRunMessages": true, |
||||
"launchBrowser": true, |
||||
"applicationUrl": "http://localhost:5233", |
||||
"environmentVariables": { |
||||
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
} |
||||
}, |
||||
"https": { |
||||
"commandName": "Project", |
||||
"dotnetRunMessages": true, |
||||
"launchBrowser": true, |
||||
"applicationUrl": "https://localhost:7261;http://localhost:5233", |
||||
"environmentVariables": { |
||||
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
} |
||||
}, |
||||
"IIS Express": { |
||||
"commandName": "IISExpress", |
||||
"launchBrowser": true, |
||||
"environmentVariables": { |
||||
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,8 @@ |
||||
{ |
||||
"Logging": { |
||||
"LogLevel": { |
||||
"Default": "Information", |
||||
"Microsoft.AspNetCore": "Warning" |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
{ |
||||
"ConnectionStrings": { |
||||
"DefaultConnection": "Server=peacecloud.synology.me; Port=23306; Database=BLAZORAUTH; Uid=pds; Pwd=Pds92070983!@" |
||||
}, |
||||
"Logging": { |
||||
"LogLevel": { |
||||
"Default": "Information", |
||||
"Microsoft.AspNetCore": "Warning" |
||||
} |
||||
}, |
||||
"AllowedHosts": "*" |
||||
} |
@ -0,0 +1,191 @@ |
||||
@import '/_content/Microsoft.FluentUI.AspNetCore.Components/css/reboot.css'; |
||||
|
||||
body { |
||||
--body-font: "Segoe UI Variable", "Segoe UI", sans-serif; |
||||
font-family: var(--body-font); |
||||
font-size: var(--type-ramp-base-font-size); |
||||
line-height: var(--type-ramp-base-line-height); |
||||
margin: 0; |
||||
} |
||||
|
||||
.navmenu-icon { |
||||
display: none; |
||||
} |
||||
|
||||
.main { |
||||
min-height: calc(100dvh - 86px); |
||||
color: var(--neutral-foreground-rest); |
||||
align-items: stretch !important; |
||||
} |
||||
|
||||
.body-content { |
||||
align-self: stretch; |
||||
height: calc(100dvh - 86px) !important; |
||||
display: flex; |
||||
} |
||||
|
||||
.content { |
||||
padding: 0.5rem 1.5rem; |
||||
align-self: stretch !important; |
||||
width: 100%; |
||||
} |
||||
|
||||
.manage { |
||||
width: 100dvw; |
||||
} |
||||
|
||||
footer { |
||||
background: var(--neutral-layer-4); |
||||
color: var(--neutral-foreground-rest); |
||||
align-items: center; |
||||
padding: 10px 10px; |
||||
} |
||||
|
||||
footer a { |
||||
color: var(--neutral-foreground-rest); |
||||
text-decoration: none; |
||||
} |
||||
|
||||
footer a:focus { |
||||
outline: 1px dashed; |
||||
outline-offset: 3px; |
||||
} |
||||
|
||||
footer a:hover { |
||||
text-decoration: underline; |
||||
} |
||||
|
||||
.alert { |
||||
border: 1px dashed var(--accent-fill-rest); |
||||
padding: 5px; |
||||
} |
||||
|
||||
|
||||
#blazor-error-ui { |
||||
background: lightyellow; |
||||
bottom: 0; |
||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); |
||||
display: none; |
||||
left: 0; |
||||
padding: 0.6rem 1.25rem 0.7rem 1.25rem; |
||||
position: fixed; |
||||
width: 100%; |
||||
z-index: 1000; |
||||
margin: 20px 0; |
||||
} |
||||
|
||||
#blazor-error-ui .dismiss { |
||||
cursor: pointer; |
||||
position: absolute; |
||||
right: 0.75rem; |
||||
top: 0.5rem; |
||||
} |
||||
|
||||
.blazor-error-boundary { |
||||
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; |
||||
padding: 1rem 1rem 1rem 3.7rem; |
||||
color: white; |
||||
} |
||||
|
||||
.blazor-error-boundary::before { |
||||
content: "An error has occurred. " |
||||
} |
||||
|
||||
.loading-progress { |
||||
position: relative; |
||||
display: block; |
||||
width: 8rem; |
||||
height: 8rem; |
||||
margin: 20vh auto 1rem auto; |
||||
} |
||||
|
||||
.loading-progress circle { |
||||
fill: none; |
||||
stroke: #e0e0e0; |
||||
stroke-width: 0.6rem; |
||||
transform-origin: 50% 50%; |
||||
transform: rotate(-90deg); |
||||
} |
||||
|
||||
.loading-progress circle:last-child { |
||||
stroke: #1b6ec2; |
||||
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; |
||||
transition: stroke-dasharray 0.05s ease-in-out; |
||||
} |
||||
|
||||
.loading-progress-text { |
||||
position: absolute; |
||||
text-align: center; |
||||
font-weight: bold; |
||||
inset: calc(20vh + 3.25rem) 0 auto 0.2rem; |
||||
} |
||||
|
||||
.loading-progress-text:after { |
||||
content: var(--blazor-load-percentage-text, "Loading"); |
||||
} |
||||
|
||||
code { |
||||
color: #c02d76; |
||||
} |
||||
|
||||
@media (max-width: 600px) { |
||||
.header-gutters { |
||||
margin: 0.5rem 3rem 0.5rem 1.5rem !important; |
||||
} |
||||
|
||||
[dir="rtl"] .header-gutters { |
||||
margin: 0.5rem 1.5rem 0.5rem 3rem !important; |
||||
} |
||||
|
||||
.main { |
||||
flex-direction: column !important; |
||||
row-gap: 0 !important; |
||||
} |
||||
|
||||
nav.sitenav { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
#main-menu { |
||||
width: 100% !important; |
||||
} |
||||
|
||||
#main-menu > div:first-child:is(.expander) { |
||||
display: none; |
||||
} |
||||
|
||||
.navmenu { |
||||
width: 100%; |
||||
} |
||||
|
||||
#navmenu-toggle { |
||||
appearance: none; |
||||
} |
||||
|
||||
#navmenu-toggle ~ nav { |
||||
display: none; |
||||
} |
||||
|
||||
#navmenu-toggle:checked ~ nav { |
||||
display: block; |
||||
} |
||||
|
||||
.navmenu-icon { |
||||
cursor: pointer; |
||||
z-index: 10; |
||||
display: block; |
||||
position: absolute; |
||||
top: 15px; |
||||
left: unset; |
||||
right: 20px; |
||||
width: 20px; |
||||
height: 20px; |
||||
border: none; |
||||
} |
||||
|
||||
[dir="rtl"] .navmenu-icon { |
||||
left: 20px; |
||||
right: unset; |
||||
} |
||||
} |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 15 KiB |
Loading…
Reference in new issue