Создание Scoped Service для инициализации пользователя в Blazor United (Hybrid WebApp)C#

Место общения программистов C#
Ответить
Anonymous
 Создание Scoped Service для инициализации пользователя в Blazor United (Hybrid WebApp)

Сообщение Anonymous »

Так что я пытаюсь провести минимальное тестирование. Я создал новый проект (BlazorApp1), используя шаблон Blazor Web App, с примерами файлов. /counter.
Я пытаюсь сделать его на шаг, создавая услугу, которая работает в любое время, когда пользователь обращается к сайту (для инициализации пользовательских данных). < /p>
userservice.cs:
public class UserService
{
public AuthenticationStateProvider AuthenticationStateProvider { get; set; }
private IHttpContextAccessor HttpContextAccessor { get; set; }
public UserInfo User = new();
private bool _initalized = false;
public UserService(AuthenticationStateProvider _AuthenticationStateProvider, IHttpContextAccessor _HttpContextAccessor)
{
AuthenticationStateProvider = _AuthenticationStateProvider;
HttpContextAccessor = _HttpContextAccessor;
}
public async Task InitUser()
{
if(_initalized)
return;
var userAuth = await authenticationStateProvider.GetAuthenticationStateAsync();
User.Email = userAuth.User.Claims.FirstOrDefault(x => x.Type == "EmailAddress")?.Value;
using(var db = new dbContext())
{
var DbRoles = db.access_control!.FirstOrDefault(x => x.email == User.Email);
if (DbRoles is not null)
{
User.Roles = DbRoles.roles;
}
}
ClaimsIdentity id = new();
if (User.Roles is null)
{
id.AddClaim(new Claim(ClaimTypes.Role, "None"));
}
else
{
foreach (var role in User.Roles)
{
id.AddClaim(new Claim(ClaimTypes.Role, role));
}
}
userAuth.User.AddIdentity(id);
_initalized = true;
}
public class UserInfo
{
public string? Email { get; set; }
public List? Roles { get; set; }
}
}
< /code>
program.cs:
using BlazorApp1.Client.Pages;
using BlazorApp1.Components;
using BlazorApp1.Components.User;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components.Server.Circuits;
using Sustainsys.Saml2;
using Sustainsys.Saml2.AspNetCore2;
using Sustainsys.Saml2.Metadata;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddInteractiveWebAssemblyComponents();
builder.Services.Configure(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
options.Secure = CookieSecurePolicy.SameAsRequest;
options.HttpOnly = Microsoft.AspNetCore.CookiePolicy.HttpOnlyPolicy.Always; // Enable HttpOnly for cookies

});
builder.Services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

sharedOptions.DefaultChallengeScheme = Saml2Defaults.Scheme;
}).AddCookie()
.AddSaml2();

builder.Services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
// Add services to the container.
builder.Services.AddSignalR();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
builder.Services.AddHttpClient();
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// 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.UseAuthentication();

app.UseAuthorization();
app.MapRazorComponents()
.AddInteractiveServerRenderMode()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(BlazorApp1.Client._Imports).Assembly);

app.Run();
< /code>
app.razor:
@using BlazorApp1.Components.User
@inject UserService UserService




















@code
{
private bool _initalized = false;
protected override async Task OnInitializedAsync()
{
if (!_initalized)
{
await UserService.InitUser();
_initalized = true;
}
}

}

< /code>
Самая большая проблема, с которой я сталкиваюсь с этим кодом, заключается в том, что, когда я меняю страницы, используя образец Navmenu, пользовательский сервис всегда поврежден. Поражает цель Blazor United и, по сути, просто изменяет его на сервер Blazor, поскольку компоненты больше не смогут быть отображаются в InteractiveWebassembly. < /p>
Примечания: < /p>

Мы используем SAML SSO для аутентификации, но управляйте контролем доступа через DataBase (hence hence) < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < / /> < /> < /> < />. Включите код, который был бы актуальным и удаленным/отредактировал все, что не дает значительного понимания.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... rid-webapp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»