Blazor:没有会话/ JWT令牌时重定向到登录页面?

问题描述 投票:2回答:3

我正在尝试在Blazor中创建一个新的应用程序,我正在进行身份验证。我正在使用存储在本地存储中的JWT令牌。当应用程序加载时,我需要检查存储中是否有令牌。如果是这样,将其添加到所有API请求的HTTP标头中,如果没有,则在页面加载之前重定向到登录页面.......我在哪里这样做?有多个页面需要进行此检查,因此需要在一个位置完成,以覆盖所有页面。这应该在Startup中完成吗?

搜索没有提供解决方案,因为我是Blazor的新手,找到正确的搜索条件有点困难:)

c# authentication redirect login blazor
3个回答
1
投票

你是什​​么意思Startup?启动课,对吗?

目前,Razor Components框架没有应用程序事件周期。要有耐心......它即将到来......同时,为了学习,请使用组件事件周期。通常,您应将yourJWT存储在本地存储中,包括有关用户的数据,是否已经过身份验证等,以及在用户通过身份验证时检索此数据的服务。只要需要身份验证(或授权),您就可以调用此服务。

顺便说一下,你并不是要通过说“before the page loads”来停止...的过程。您只是意味着您不希望显示“在线约会网站”中的“新配置文件页面”,如果用户未经过身份验证,对吗?那么,在这种情况下,从页面(Component)OnInit或OnInitAsync方法调用身份验证本地服务(从本地存储中检索数据)。

希望这可以帮助...


2
投票

我做的是编写我自己的http服务来做到这一点。

它被称为Backend,并具有令牌的属性,如下所示:

    public string ApiToken
    {
        get
        {
            if (!string.IsNullOrEmpty(apitoken))
                return apitoken;

            apitoken = Browser.ReadStorage("apitoken");
            return apitoken;
        }

        set
        {
            Browser.WriteStorage("apitoken", value);
        }
    }

然后在这个类中实现http类具有的所有方法,同时注入您的令牌。例如:

    public async Task<T> GetJsonAsync<T>(string uri)
    {
            this.InProgress = true;
            var result = await http.GetJsonAsync<ServerResult<T>>(uri, this.ApiToken);
            this.InProgress = false;

            if (!result.Success)
            {
                BlazorExtensions.Browser.Alert($"Error: {result.ErrorMessage}");
                return default(T);
            }

            return result.ValueObject;

    }

并且到处都使用后端服务来完成您的请求。也方便你的api url。

编辑对于重定向部分:为简洁起见,我省略了这一部分,但这是完整的方法:

    public async Task<T> GetJsonAsync<T>(string uri)
    {
        try
        {
            this.InProgress = true;
            var result = await http.GetJsonAsync<ServerResult<T>>(uri, this.ApiToken);
            this.InProgress = false;

            if (!result.Success)
            {
                BlazorExtensions.Browser.Alert($"Error: {result.ErrorMessage}");
                return default(T);
            }

            return result.ValueObject;
        }
        catch (UnauthorizedAccessException)
        {
            this.InProgress = false;
            uriHelper.NavigateTo("/bzr/Logon");
            return default(T);
        }
        catch (Exception e)
        {
            BlazorExtensions.Browser.Alert($"Fout bij http fetch: {e.Message}");
            this.InProgress = false;
            return default(T);
        }
    }

uriHelper只是在构造函数中注入:

    public IUriHelper uriHelper { get; private set; }

    public Backend(HttpClient httpInstance, IUriHelper uriHelper)
    {
        http = httpInstance;
        this.uriHelper = uriHelper;

猜猜你需要什么?


0
投票

一个解决方案(现在,我认为不是最好的?)是为所有组件页面创建一个基类来继承和覆盖OnInit方法来进行检查和重定向。在加载应用程序后导航到链接时,这也适用。

对app.cshtml组件的检查仅适用于初始启动,而不适用于在应用程序中导航。这对其他检查很好,但不能保护路线。

© www.soinside.com 2019 - 2024. All rights reserved.