具有身份权限授权重定向循环的 Blazor 服务器
Blazor Server with Identity permissions authorization redirect loop
所以,我有一个新的 Blazor .net 6 应用程序,它使用 .net Identity 进行身份验证。我试图通过遵循 this 教程来实现基于权限的授权。据我所知,我已经正确设置了所有内容,但是当我启动该应用程序时,我立即遇到了重定向循环、显示“页面未正确重定向”的错误和 URL大约有 2600 个字符长(https://localhost:7121/Identity/Account/Login?ReturnUrl=%252FIdentity%252FAccount%252FLogin%253FReturnUrl%253D%25252FIdentity%25252FAccount%25252FLogin%25253...)。
作为教程的一部分,我向 Program.cs 添加了两项服务。
builder.Services.AddSingleton<IAuthorizationPolicyProvider, PermissionPolicyProvider>(); // Redirect error goes away if this is commented out
builder.Services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();
如果我注释掉 PermissionPolicyProvider 行,重定向就会消失,我可以登录,但我没有授权。如果我注释掉 PermissionPolicyProvider,登录,取消注释 PermissionPolicyProvider 并重新启动应用程序,授权有效,但一旦我注销,我立即收到重定向错误。访问具有 [Authorize]
的页面和具有 [AllowAnonymous]
.
的页面时会出现错误
这是 PermissionPolicyProvider:
public class PermissionPolicyProvider : IAuthorizationPolicyProvider
{
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
public PermissionPolicyProvider( IOptions<AuthorizationOptions> options )
{
FallbackPolicyProvider = new DefaultAuthorizationPolicyProvider( options );
}
public Task<AuthorizationPolicy> GetDefaultPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
public Task<AuthorizationPolicy> GetPolicyAsync( string policyName )
{
if ( policyName.StartsWith( CustomClaimTypes.Permission, StringComparison.OrdinalIgnoreCase ) )
{
var policy = new AuthorizationPolicyBuilder();
policy.AddRequirements( new PermissionRequirement( policyName ) );
return Task.FromResult( policy.Build() );
}
return FallbackPolicyProvider.GetPolicyAsync( policyName );
}
public Task<AuthorizationPolicy> GetFallbackPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
}
我的 App.razor 文件中有一个重定向未经身份验证的用户的重定向,重定向工作正常,即使我从 App.razor 中删除了重定向,我仍然收到重定向错误。在这一点上,我不太确定去哪里看。当我实现 PermissionPolicyProvider 时,有什么我可能会忽略的吗?
改变这个:
public Task GetFallbackPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
对此:
public Task GetFallbackPolicyAsync() => FallbackPolicyProvider.GetFallbackPolicyAsync();
已解决问题。
所以,我有一个新的 Blazor .net 6 应用程序,它使用 .net Identity 进行身份验证。我试图通过遵循 this 教程来实现基于权限的授权。据我所知,我已经正确设置了所有内容,但是当我启动该应用程序时,我立即遇到了重定向循环、显示“页面未正确重定向”的错误和 URL大约有 2600 个字符长(https://localhost:7121/Identity/Account/Login?ReturnUrl=%252FIdentity%252FAccount%252FLogin%253FReturnUrl%253D%25252FIdentity%25252FAccount%25252FLogin%25253...)。
作为教程的一部分,我向 Program.cs 添加了两项服务。
builder.Services.AddSingleton<IAuthorizationPolicyProvider, PermissionPolicyProvider>(); // Redirect error goes away if this is commented out
builder.Services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();
如果我注释掉 PermissionPolicyProvider 行,重定向就会消失,我可以登录,但我没有授权。如果我注释掉 PermissionPolicyProvider,登录,取消注释 PermissionPolicyProvider 并重新启动应用程序,授权有效,但一旦我注销,我立即收到重定向错误。访问具有 [Authorize]
的页面和具有 [AllowAnonymous]
.
这是 PermissionPolicyProvider:
public class PermissionPolicyProvider : IAuthorizationPolicyProvider
{
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
public PermissionPolicyProvider( IOptions<AuthorizationOptions> options )
{
FallbackPolicyProvider = new DefaultAuthorizationPolicyProvider( options );
}
public Task<AuthorizationPolicy> GetDefaultPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
public Task<AuthorizationPolicy> GetPolicyAsync( string policyName )
{
if ( policyName.StartsWith( CustomClaimTypes.Permission, StringComparison.OrdinalIgnoreCase ) )
{
var policy = new AuthorizationPolicyBuilder();
policy.AddRequirements( new PermissionRequirement( policyName ) );
return Task.FromResult( policy.Build() );
}
return FallbackPolicyProvider.GetPolicyAsync( policyName );
}
public Task<AuthorizationPolicy> GetFallbackPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
}
我的 App.razor 文件中有一个重定向未经身份验证的用户的重定向,重定向工作正常,即使我从 App.razor 中删除了重定向,我仍然收到重定向错误。在这一点上,我不太确定去哪里看。当我实现 PermissionPolicyProvider 时,有什么我可能会忽略的吗?
改变这个:
public Task GetFallbackPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
对此:
public Task GetFallbackPolicyAsync() => FallbackPolicyProvider.GetFallbackPolicyAsync();
已解决问题。