BlazorServer非鉴权的登录和注册

本文介绍了如何在BlazorServer项目中实现登录和注册功能,不依赖Authorize标签。通过创建AuthService类模拟登录逻辑,使用localStorage存储用户信息。同时,展示了登录和注册的.Razor组件代码,并提到需在其他页面检测localStorage中的用户信息以实现权限拦截。

BlazorServer入门 简单的登录与注册的设计

🎃 前言:

为了简单起见,本文不采用Autherize标签等直接可用的工具来实现登录和注册的设计。

现创建一个BlazorServer模板,使用的.Net Core版本为3.1。

请添加图片描述
请添加图片描述

🎫Blazor需要创建页面(组件)时请直接使用.razor不要使用.cshtml

请添加图片描述

🍶 Step 1:模拟AuthService(模拟登录逻辑)

public class AuthService
{
    /// <summary>
    /// 该工具用来控制前台的js交换
    /// 这里使用该工具的目的是:调用js的向localStorage(浏览器)中保存信息。[如果你是3.1向上的.NetCore版本,请直接使用ProtectedLocalStorage保存信息]
    /// </summary>
    private IJSRuntime jsruntime;

    public AuthService(IJSRuntime jSRuntime)
    {
        this.jsruntime = jSRuntime;
    }

    public static List<TestUser> list = new List<TestUser>() { new TestUser() { username = "root",password = "1234", nickname = "礼堂丁真", age = 27 } };

    public TestUser LoginMethod(string username,string password)
    {
        if (list.Any(it => it.username.Equals(username) && it.password.Equals(password)))
        {
            TestUser loginer = list.Where(it => it.username.Equals(username)).FirstOrDefault();
            jsruntime.InvokeVoidAsync("localStorage.setItem", new object[2] { "currentUser", JsonConvert.SerializeObject(loginer) });
            return loginer;
        } 
        else
            return null;
    }


    public (bool,string) Register(string username,string password,string nickname)
    {
        if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(nickname))
            return (false, "Not NULL!");

        if (list.Any(it => it.username.Equals(username)))
        {
            return (false,"用户名不能重复");
        }

        AuthService.list.Add(new TestUser() { username = username, password = password, nickname = nickname, age = 20 });
        jsruntime.InvokeVoidAsync("alert", new object[1] { "success" });
        return (true, "已注册");
    }
}

public class TestUser
{
    public string username { get; set; }

    public string password { get; set; }

    public string nickname { get; set; }

    public int? age { get; set; }
}

注册到StartUp中

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<AuthService>(); //注册IOC
}

🐟 Step 2:添加登录和注册页面(.razor组件)

@page "/login"

@using Data;

@inject AuthService auth
@inject NavigationManager nvm
@inject IJSRuntime runtime

<h3>Login</h3>

<span>UN:</span>
<input type="text" class="input-group-text" id="UN" @bind-value="UserName" /><br />

<span>PW:</span>
<input type="text" class="input-group-text" id="PW" @bind-value="PassWord" /><br />

<button @onclick="()=> { DoLogin(UserName,PassWord);  }">Submit</button>


@code {

    public string UserName { get; set; }

    public string PassWord { get; set; }

    public bool hid = true;

    public void DoLogin(string UserName,string PassWord)
    {
        var User =  auth.LoginMethod(UserName, PassWord);
        if (User != null)
            nvm.NavigateTo($@"/");
        else
        {
            runtime.InvokeVoidAsync("alert", "Login failed");
        }
    }

}
@page "/register"

@using Data

@inject AuthService auth
@inject NavigationManager nvm
@inject IJSRuntime jsruntime

<h3>Register</h3>

<span>UN:</span>
<input type="text" class="input-group-text" @bind-value="UserName" />
<br />

<span>PW:</span>
<input type="password" class="input-group-text" @bind-value="PassWord" />
<br />
<span>PW_confirm:</span>
<input type="password" class="input-group-text" @bind-value="PassWord2" />
<br />

<button class="btn-info" @onclick="()=> { RegisterMethod(UserName, PassWord, PassWord2);  }"> regist </button>

@code {
    public string UserName { get; set; }

    public string PassWord { get; set; }

    public string PassWord2 { get; set; }

    public void RegisterMethod(string UserName,string PassWord,string PassWord2)
    {
        var res =  auth.Register(UserName, PassWord, PassWord2);

        if (res.Item1)
        {
            jsruntime.InvokeVoidAsync("alert", "register success");
            nvm.NavigateTo("/login");
        }
        else
        {
            jsruntime.InvokeVoidAsync("alert", "register failed");
        }

    }


}

为什么拦截其他页面,需要在你的其他页面添加OnAfterRenderAsync方法从写。

并在发放中检查存放的Storage信息是否有效。若找不到则直接导航到登录页。

例如:

@inherits LayoutComponentBase
@inject IJSRuntime runtime
@inject NavigationManager nvm

<div class="sidebar">
    <NavMenu />
</div>

<div class="main">
    <div class="top-row px-4">
        <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
    </div>

    <div class="content px-4">
        @Body
    </div>
</div>

@code{
    

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        //检查是否带有登录信息
        string user = await runtime.InvokeAsync<string>("localStorage.getItem", "currentUser");

        if (string.IsNullOrEmpty(user))
        {
            nvm.NavigateTo("/login");
        }
        base.OnAfterRender(firstRender);
    }

}

🌮 Step 3:测试截图

请添加图片描述

项目代码已上传至gitcode

罗马苏丹默罕默德 / BlazorServerTest · GitCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马苏丹默罕默德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值