上篇已经实现了登录与退出的主服务类,其他还需要一些具体的东西。
1、引用Blazored.LocalStorage包;
2、新建JwtOption类:
public class JwtOption
{
public string Key { get; set; } = default!;
public string Issuer { get; set; } = default!;
public string Audience { get; set; } = default!;
public int ExpiryInHours { get; set; }
}
3、添加JWT设置,在appsettings.json中添加:
"JWT": {
"Key": "xxxx",
"Issuer": "xxxx.cn",
"Audience": "xxxx",
"ExpiryInHours": 8
}
注意:Key要求有一定的长度,建议复制新生成的Guid.NewGuid().ToString();
4、登录类:
public class LoginDto
{
[Display(Name = "账号")]
[Required(ErrorMessage = "请输入账号!")]
[StringLength(20,ErrorMessage = "账号为4至20字母!", MinimumLength = 4)]
public string UserName { get; set; } = string.Empty;
[Display(Name = "密码")]
[Required(ErrorMessage = "请输入密码!")]
[DataType(DataType.Password)]
[MinLength(6, ErrorMessage = "密码最小长度6位。")]
public string Password { get; set; } = string.Empty;
}
5、登录退出服务类:
public interface IAuthService
{
Task<bool> Login(LoginDto rqtDto);
Task Logout();
}
public class AuthService : IAuthService
{
private readonly AuthenticationStateProvider _authenticationStateProvider;
public AuthService(AuthenticationStateProvider authenticationStateProvider)
{
_authenticationStateProvider = authenticationStateProvider;
}
public async Task<bool> Login(LoginDto rqtDto)
{
return await ((RevalidatingIdentityAuthenticationStateProvider<AppUser>)_authenticationStateProvider).MarkUserAsAuthenticated(rqtDto);
}
public async Task Logout()
{
await ((RevalidatingIdentityAuthenticationStateProvider<AppUser>)_authenticationStateProvider).MarkUserAsLoggedOutAsync();
}
}
注意:需要注册服务。
6、注册JWT认证服务:
builder.Services.AddBlazoredLocalStorage(config =>
{
config.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
//config.JsonSerializerOptions.IgnoreNullValues = true;
config.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
config.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
config.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
config.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
config.JsonSerializerOptions.WriteIndented = false;
});
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration.GetValue<string>("JWT:Issuer"),
ValidAudience = builder.Configuration.GetValue<string>("JWT:Audience"),
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration.GetValue<string>("JWT:Key"))),
RequireExpirationTime = true
};
});
builder.Services.Configure<JwtOption>(builder.Configuration.GetSection("JWT"));
7、登录Razor组件与登录母版(略)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)