RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1340505
Accepted
LiptonDev
LiptonDev
Asked:2022-03-21 16:28:43 +0000 UTC2022-03-21 16:28:43 +0000 UTC 2022-03-21 16:28:43 +0000 UTC

关于 blazor 服务器端的几个问题

  • 772

我开始学习 blazor (SERVER SIDE (!)) 并面临不理解和无法在 Google 中找到我的问题的答案。

  1. 怎么做才能在进入网站时立即重定向到授权页面,即 该网站的所有页面仅供授权用户使用;
  2. 是否可以将页面转移到图书馆?我试图将授权页面转移到 Pages 文件夹中的单独库,但应用程序顽固地看不到此页面。它只打印“对不起,这个地址没有任何东西。”;

也许我对谷歌的第一个问题有部分答案,但我不确定它是否正确,我附上:
向 _Imports.razor 添加了授权属性:

@attribute [Authorize]

在 App.razor 中,我将结构更改为:

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    <RedirectToLogin/>
                </NotAuthorized>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

其中 RedirectToLogin 是一个单独位于另一个库中的剃须刀组件(它可以正常工作并重定向所有内容,但看不到 /login 页面):

@inject NavigationManager navManager

@code {
    protected override void OnInitialized()
    {
        navManager.NavigateTo("login");
    }
}

/login 页面在哪里(位于路径上的另一个库中:MySite.SecondLib/Pages/Login.razor):

@page "/login"

<h1>LOGIN PAGE</h1>
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Lapish
    2022-03-22T02:47:53Z2022-03-22T02:47:53Z

    我正在使用 blazor-wasm,但我认为以下内容也适用于服务器端。

    第一个问题的答案。

    1. 从导入中删除 @attribute [Authorize]
    2. 在 RedirectToLogin 组件中,调用 navManager.NavigateTo("login"); 不是来自 OnInitialized,而是来自 OnAfterRender。没有在 ServerSide 上测试它,但在 WASM 上捕获 null。
    3. 您需要声明自己的 AuthenticationStateProvider 类实现并覆盖其 GetAuthenticationStateAsync 方法,每次都会调用该方法来检查用户的身份验证。此外,这个实现需要注入到我们的容器中。
    services.AddScoped<AuthenticationStateProvider, YourStateProvider>();
    

    我的替代的简短版本:

    public class YourStateProvider : AuthenticationStateProvider
    {
        //Мой сервис для идентификации, аутентификации, авторизации
        private readonly ISecurityService _securityService;
    
        public YourStateProvider(ISecurityService securityService)
        {
            _securityService = securityService;
        }
    
        public override async Task<AuthenticationState> GetAuthenticationStateAsync()
        {
            //Проверяю, если уже в памяти содержится JWT
            if (!string.IsNullOrWhiteSpace(_securityService.AccessToken))
            {
                return GetAuthState();
            }
    
            try
            {
                //Иначе пытаюсь обновить его. New - вызов cqrs-команды
                await _securityService.RefreshTokensAsync(new());
                return GetAuthState();
            }
            catch
            {
                //Возвращаю анонимного пользователя
                return GetAnonymousState();
            }
        }
    
        #region Private methods
    
        private AuthenticationState GetAnonymousState()
        {
            var anonymousIdentity = new ClaimsIdentity();
            var anonymousPrincipal = new ClaimsPrincipal(anonymousIdentity);
            return new AuthenticationState(anonymousPrincipal);
        }
    
        private AuthenticationState GetAuthState()
        {
            var identity = new ClaimsIdentity(_securityService.Claims, "jwtAuthType");
            var principal = new ClaimsPrincipal(identity);
            return new AuthenticationState(principal);
        }
    
        #endregion
    }
    

    但在我的真实代码中,逻辑更复杂。您很可能会创建另一个在成功授权后调用的公共方法,例如,从同一个登录页面。示例清单:

    public class LoginViewModel : ViewModelBase
    {
        private readonly ISecurityService _securityService;
        private readonly YourStateProvider _stateProvider;
        private readonly NavigationManager _navigationManager;
    
        public LoginViewModel(
            ISecurityService securityService,
            AuthenticationStateProvider authStateProviderб
            NavigationManager navigationManager)
        {
            _securityService = securityService;
            _stateProvider = (YourStateProvider)authStateProvider;
            _navigationManager = navigationManager;
        }
    
        private async Task LoginExecuteAsync()
        {
            await _securityService.LoginAsync("Отправляем запрос на авторизацию login/pass");
            _stateProvider.NotifyStateChanged();//Уведомляем наш StateProvider о том, что вы вошли
            _navigationManager.NavigateTo("/"); //Редирект в корень
        }
    }
    

    有用的链接:

    1. 一次
    2. 二

    并且页面没有转移到图书馆。在一个单独的库中,我有服务、资源、api 等。在客户端(wasm)中,我连接了所有这些,放置了几个组件和 90% 的文件 - view、view.cs + viewmodel

    • 1

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5