Как запустить несколько приложений Blazor на одном веб-сайте

Я хотел бы создать один веб-сайт, на котором некоторые вспомогательные функции будут разделены на несколько проектов Blazor.

Таким образом, основной сайт - это одно приложение Blazor, но / private и / shop - это отдельные приложения Blazor, в которых пользователям необходимо зарегистрироваться и войти в систему, чтобы получить доступ к функциям. Поскольку на основном сайте должна быть панель навигации, общая для всех сайтов (там есть кнопки входа и регистрации), как вы можете общаться между приложениями Blazor?

Если я настроил аутентификацию на основном сайте и использую AppState на основном сайте для хранения значений, как может суб-приложение, работающее в / частном режиме, получить доступ к этим данным (например, isLogged in или userName data).


person Dino Novak    schedule 20.09.2020    source источник


Ответы (2)


Это кажется многообещающим: Blazor с несколькими приложениями

Я тоже пытался понять, как это сделать. В приведенном выше примере показано, как связать два приложения Blazor на стороне клиента с одним приложением Blazor на стороне сервера в одном решении. Главное, что я вынес из этого примера, - это дополнения к Configure при запуске серверного приложения.

        app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/FirstApp"), first =>
        {
            first.UseBlazorFrameworkFiles("/FirstApp");
            first.UseStaticFiles();

            first.UseRouting();
            first.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapFallbackToFile("FirstApp/{*path:nonfile}", "FirstApp/index.html");
            });
        });

        app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/SecondApp"), second =>
        {
            second.UseBlazorFrameworkFiles("/SecondApp");
            second.UseStaticFiles();

            second.UseRouting();
            second.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapFallbackToFile("SecondApp/{*path:nonfile}", "SecondApp/index.html");
            });
        });

Надеюсь это поможет.

person RoofusEat    schedule 10.02.2021

Не совсем уверен, о чем вы здесь спрашиваете, но несколько проектов могут взаимодействовать друг с другом.

SignalR Core - ключ к тому, чтобы это стало возможным. Для этого просто нужен работающий хаб.

Для Blazor: https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr-blazor?view=aspnetcore-5.0&tabs=visual-studio&pivots=server

В другом приложении я использовал консоль C # для связи со своим сайтом. Вот пример кода

using Microsoft.AspNetCore.SignalR.Client;
using System;

namespace SignalRConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            HubConnection hubConnection;
            hubConnection = new HubConnectionBuilder()
                .WithAutomaticReconnect()
                .WithUrl("https://localhost/{hubname}")
                .Build();

            hubConnection.On<bool>("IsAuthenticated", (b) =>
            {
                if (b)
                    Console.WriteLine("Valid");
                else
                    Console.WriteLine("Invalid");
            });

            hubConnection.StartAsync();

            while (true)
            {
                Console.WriteLine("Username");
                string username = Console.ReadLine();

                Console.WriteLine("Password");
                string pwd = Console.ReadLine();

                hubConnection.SendAsync("CheckLogin", username, pwd);
            }
        }
    }
}

О классе концентратора блейзера

public class AppHub : Hub
{
    private readonly UserManager<IdentityUser> _userManager;
    public AppHub(UserManager<SocialUser> userManager)
    {
        _userManager = userManager;
    }
    
    public async void CheckLogin(string UserName, string pwd)
    {
        var user = _userManager.Users.Where(x => x.UserName == UserName).FirstOrDefault();
        if (_userManager.CheckPasswordAsync(user, pwd).Result)
        {
            //This is optional
            await Groups.AddToGroupAsync(Context.ConnectionId, UserName);
            await Clients.Caller.SendAsync("IsAuthenticated", true);
        }
        else
            await Clients.Caller.SendAsync("IsAuthenticated", false);
    }
}

Если бы это был не тот ответ, не лучше ли было бы просто использовать базу данных для определения того, у кого есть аутентификация?

person RedRevYol    schedule 29.06.2021