我有一个 razor Pages/mvc Web 应用程序,它使用 ASP.Net Core Identity 进行身份验证和授权。我开始使用 MAUI 开发该网站的移动应用程序版本,并希望访问许多相同的端点(其中一些是页面 javascript 的 WebAPI 端点),但我正在努力让 Web 应用程序身份验证与 IdentityApiEndpoints 一起工作以获取MAUI 应用程序的令牌。第一个问题是混合两种身份验证是否是正确的做法?
假设这是进行身份验证的可行方法,我如何才能使其与两者一起使用。这就是我最初拥有的:
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
我尝试使用新的 AddIdentityApiEndpoints:
builder.Services.AddIdentityApiEndpoints<ApplicationUser>()
.AddRoles<IdentityRole>() //Needs to come before the EntityFramework stores to work
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
...
app.MapIdentityApi<ApplicationUser>().AllowAnonymous();
这主要有效,但我似乎无法将重定向添加到登录页面 - 即,如果有人在未登录的情况下导航到主页,它曾经重定向到登录页面,但不再这样做。我也尝试过:
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddApiEndpoints()
.AddDefaultUI()
.AddDefaultTokenProviders();
但是当我尝试使用邮递员登录时,我收到此错误:
System.InvalidOperationException: 'No sign-in authentication handler is registered for the scheme 'Identity.Bearer'. The registered sign-in schemes are: Identity.Application, Identity.External, Identity.TwoFactorRememberMe, Identity.TwoFactorUserId. Did you forget to call AddAuthentication().AddCookie("Identity.Bearer",...)?'
如何配置它以仍然重定向到登录屏幕?
发布我的解决方案,以防它对其他人有帮助。我需要添加不记名令牌作为身份验证方案,如下所示:
builder.Services.AddAuthentication()
.AddBearerToken(IdentityConstants.BearerScheme);
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddApiEndpoints()
.AddDefaultUI()
.AddDefaultTokenProviders();
然后我需要允许匿名访问这些 API 端点:
app.RegisterApiEndpoints();
app.MapIdentityApi<ApplicationUser>().AllowAnonymous();
最后,我需要添加一个自定义策略,该策略接受不记名令牌和 cookie 到将使用不记名令牌访问的端点。这里的答案确实有帮助: 为什么在 dotnet 7 中使用 WebApi 和 AspIdentityCore 以及 JwtBearer 时会重定向到帐户/登录页面?