Blazor:身份验证仍然是错误的
Posted
技术标签:
【中文标题】Blazor:身份验证仍然是错误的【英文标题】:Blazor: Authentication remains false 【发布时间】:2022-01-08 20:07:18 【问题描述】:我的 Startup.cs 文件中有一个中间件,用于检查用户当前的身份验证状态。但是,在调试时,似乎即使在成功登录后,身份验证仍然是错误的。我一直在寻找解决方案,其中许多提供的解决方案不起作用或不适用于我的项目。我想知道是否有人遇到过这个问题,或者可以提供任何关于我如何解决这个问题的见解。提前致谢
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseIdentityServer();
app.UseAuthentication();
app.Use(async (context, next) =>
await next.Invoke();
if (context.User.Identity.IsAuthenticated)
var username = context.User.Identity.Name;
using (var dbContext = context.RequestServices.GetRequiredService<ApplicationDbContext>())
var user = dbContext.Users.Where(u => u.UserName == username).FirstOrDefault();
user.LastAccessed = DateTime.Now;
dbContext.Update(user);
dbContext.SaveChanges();
);
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
);
名称为空
我觉得它不知道是否有人登录,因为名称也没有显示 在此输入代码
【问题讨论】:
it appears that even after a successful login the authentication remains false
到底在哪里?您是否在自定义中间件中设置断点,IsAuthenticated
返回false
?
@Ergis 我在await next.Invoke()
放置了一个断点,if (context.User.Identity.IsAuthenticated)
执行的检查是假的,所以下面的代码被跳过了
您能检查context.User.Identity
的值/声明吗?这似乎是您的 API 服务器的问题,而不是 Blazor。
【参考方案1】:
您可以尝试将app.UseAuthentication();
放在app.UseRouting();
之前,如下所示:
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseIdentityServer();
app.UseAuthentication();
app.UseRouting();
【讨论】:
感谢您的建议,这似乎对我也不起作用。 app.UseRouting();应该在 UseIdentityServer(); 之前【参考方案2】:正如您在问题的图片中看到的那样,在这里做了一个 sn-p:
这意味着 Microsoft 正在寻找 URL 格式的名称和角色声明,如图所示。
要告诉 Microsoft 您的声明名称是什么,您需要添加:
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
【讨论】:
【参考方案3】:可能不是 OP 所期望的,但这对于将来遇到这个问题的人来说可能会派上用场。 .NET 期望 ClaimsIdentity
具有 AuthenticationType
property set 被视为经过身份验证。
ClaimsIdentity.IsAuthenticated
如果 AuthenticationType 属性不为 null 或空字符串,则为 true。
当我自定义AuthenticationStateProvider
时,我必须确保设置它:
public class CustomAuthStateProvider : AuthenticationStateProvider
public async override Task<AuthenticationState> GetAuthenticationStateAsync()
string? authType = null;
// ...
// Without this, it won't be considered authenticated
authType = "Token";
var identity = new ClaimsIdentity(claims, authType);
var state = new AuthenticationState(new ClaimsPrincipal(identity));
return await Task.FromResult(state);
编辑:我只是仔细查看了 OP 的屏幕截图。看起来它正在发生在 API 服务器代码上。我被blazor-webassembly
标签愚弄了。
【讨论】:
以上是关于Blazor:身份验证仍然是错误的的主要内容,如果未能解决你的问题,请参考以下文章
.NET 5 Blazor 服务器 OKTA 身份验证显示 HTTP 错误 400
Blazor Open ID Connect 身份验证错误“请求包含多个客户端凭据”
使用身份验证托管的 Blazor Wasm 上出现 Azure 500 错误
升级到 .net 6 时托管的 Blazor WASM 身份验证中断