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 身份验证中断

Blazor WebAssembly SignalR 身份验证

Blazor 使用 Azure AD 身份验证允许匿名访问