Blazor Server 自定义登录退出鉴权判断

VS2022中的官方方案中,鉴权方案会用到SqlServer,而我的项目要用MySql,两者没法兼容,遂自己写了一套。

预备:用VS2022新建一个Blazor Server项目

 

第一步:编写自定义的登录,退出,鉴权类 SessionObjectHelper.cs,并且在Program.cs里注册

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;

namespace BlazorAppAuthDemo
{
    public class SessionObjectHelper
    {
        private ProtectedSessionStorage _sessionStorage;

        public SessionObjectHelper(ProtectedSessionStorage storage)
        {
            _sessionStorage = storage;
        }

        /// <summary>
        /// 是否登录
        /// </summary>
        /// <returns></returns>
        public async Task<bool> IsLogin()
        {
            var value = await _sessionStorage.GetAsync<string>("user");

            if (value.Success && !string.IsNullOrEmpty(value.Value))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 是否有权限
        /// </summary>
        /// <returns></returns>
        public async Task<bool> HasAuth(string authString)
        {
            var value = await _sessionStorage.GetAsync<string>("user");

            if (value.Success && !string.IsNullOrEmpty(value.Value))
            {
                if (!string.IsNullOrEmpty(authString) && authString.Equals(value.Value))
                {
                    return true;
                }

                return false;
            }
            else
            {
                return false;
            }
        }

        public async Task<string> GetSession()
        {
            var value = await _sessionStorage.GetAsync<string>("user");

            return value.Success?value.Value:"";
        }

        public async Task SetSession(string value)
        {
            await _sessionStorage.SetAsync("user", value);
        }

        /// <summary>
        /// 设置过期
        /// </summary>
        /// <returns></returns>
        public async Task SetExpires()
        {
            await _sessionStorage.SetAsync("user", "");
        }
    }
}

在Program.cs里注册 

builder.Services.AddScoped<SessionObjectHelper>();

 

第二步:自定义鉴权的控件 AuthComponet.razor

@using BlazorAppAuthDemo.Data
@inject SessionObjectHelper Session

@if (Logined)
{
	@if (doNotReload)
	{
		<p>出现错误,请点此刷新</p>
	}
	else
	{
		@if (HasAuth)
		{
			<CascadingValue Value="@this">
				@ChildContent
			</CascadingValue>
		}
		else
		{
			<p>暂无权限查看...</p>
		}
	}
}
else
{
	<p>尚未登录,请先 <a href="/login">登录</a></p>
}

@code {



	public bool Logined;

	public bool HasAuth;

	private bool doNotReload;


	[Parameter]
	public RenderFragment ChildContent { get; set; }


	[Inject]
	NavigationManager Navigation { get; set; }


	[Parameter]
	public string AuthString { get; set; }

	public string UserAuths { get; set; }

	protected override async Task OnInitializedAsync()
	{
		try
		{
			if (await Session.IsLogin())
			{
				Logined = true;

				if (await Session.HasAuth(AuthString))
				{
					HasAuth = true;
				}
			}

		}
		catch (Exception ex)
		{
			doNotReload = true;

			//Navigation.NavigateTo("/", true, true);
		}

	}
}

第三步:使用

1、登录页面Login.razor及方法使用

@page "/Login"

@inject SessionObjectHelper Session

<h3>登录</h3>



@code {


	protected override async Task OnAfterRenderAsync(bool firstRender)
	{

		await Session.SetSession("abc");


		await base.OnAfterRenderAsync(firstRender);
	}

}

2、退出登录页面Logout.razor及方法使用

@page "/Logout"

@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject SessionObjectHelper Session

<h3>Logout</h3>

@code {

	protected override async Task OnAfterRenderAsync(bool firstRender)
	{
		await Session.SetSession(null);

		await base.OnAfterRenderAsync(firstRender);
	}

}

3、鉴权页面Counter.razor及方法使用

@page "/counter"
@using BlazorAppAuthDemo.Data
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>


<span>是否登录 @(IsLogin)</span>

<span>是否是否有权限 @(HasAuth)</span>

<AuthComponet>

    <span>哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</span>

</AuthComponet>


@code {


    private bool IsLogin{ get; set; }

    private bool HasAuth{ get; set; }


    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }

    [Inject] 
    public SessionObjectHelper Session { get; set; } = default;


    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            IsLogin = await Session.IsLogin();

            HasAuth = await Session.HasAuth("sdef");

            this.StateHasChanged();
        }

        await base.OnAfterRenderAsync(firstRender);

    }
}

最后:验证效果

点击Counter页面,会发现有未登录和没有权限的提示

 

手动改URL为:BlazorAppAuthDemoicon-default.png?t=M1L8http://localhost:2254/login

自己玩吧:)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core Blazor Server 应用程序可以使用 ASP.NET Core 身份验证中间件来实现基于 Cookie 的登录认证。以下是实现此功能的基本步骤: 1. 在 Startup.cs 文件的 ConfigureServices 方法中添加身份验证服务: ``` services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login"; options.LogoutPath = "/Logout"; options.Cookie.Name = "MyAppCookie"; options.Cookie.HttpOnly = true; options.Cookie.SameSite = SameSiteMode.Strict; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.SlidingExpiration = true; }); ``` 在上面的代码中,我们使用 AddCookie 方法添加了基于 Cookie 的身份验证方案,并设置了一些选项。其中,LoginPath 和 LogoutPath 分别指定了登录和注销的 URL,Cookie.Name 设置了 Cookie 的名称,Cookie.HttpOnly 和 Cookie.SameSite 分别设置了 Cookie 的安全选项,Cookie.SecurePolicy 设置了 Cookie 的安全协议,SlidingExpiration 启用了滑动过期时间。 2. 在 Configure 方法中启用身份验证中间件: ``` app.UseAuthentication(); ``` 3. 在登录页面或组件中使用 SignInManager 和 UserManager 进行身份验证: ``` var result = await _signInManager.PasswordSignInAsync(username, password, rememberMe, lockoutOnFailure: false); if (result.Succeeded) { return RedirectToPage("/Index"); } else { ModelState.AddModelError(string.Empty, "用户名或密码不正确。"); return Page(); } ``` 在上面的代码中,我们使用 PasswordSignInAsync 方法验证用户的用户名和密码,并在验证通过后重定向到主页。 4. 在需要验证的页面或组件上使用 AuthorizeView 组件: ``` <AuthorizeView> <Authorized> <!-- 显示受保护的内容 --> </Authorized> <NotAuthorized> <p>请先登录。</p> <a href="/Login">登录</a> </NotAuthorized> </AuthorizeView> ``` 在上面的代码中,我们使用 AuthorizeView 组件来判断用户是否已经登录。如果已经登录,就显示受保护的内容;如果没有登录,就显示一个提示信息和登录链接。 以上是在 ASP.NET Core Blazor Server 应用程序中实现基于 Cookie 的登录认证的基本步骤。根据具体需求,还可以使用自定义身份验证方案来进行更复杂的登录认证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值