我正在创建一个Blazor服务器应用程序,该应用程序需要经过身份验证的用户才能阻止外部访问,并且我想限制注册新帐户的功能,使其仅对管理员用户可用,以防止创建不需要的帐户。
我使用的身份用户帐户是为Blazor搭建的。像this这样的解决方案至少会禁用注册,但是从那以后,我需要能够为管理用户再次启用它。我试图将注册页重新创建为Blazor组件,但是,使用生成的RegisterModel似乎对我不起作用。
答案 0 :(得分:0)
这是我在asp.net核心mvc应用程序中的操作方式 C#启动类:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy(ADMIN_ACCESS, policy => policy.RequireRole($"{UserType.Admin}"));
});
}
[Authorize("AdminAccess")]
public class AdminController : Controller
{
//Some action methods here
}
答案 1 :(得分:0)
经过大量搜索-答案最终变得相对简单。 Muhammad Hammad Maroof的解决方案虽然在技术上是正确的,但令我感到困惑,并且对于专门处理注册页面几乎没有帮助。
由于我使用的是从Blazor搭建的基于角色的身份验证-在单独的剃刀页面中,我使用以下代码来设置角色:
@code {
protected override async Task OnParametersSetAsync()
{
await SetUpAuth();
}
private async Task SetUpAuth()
{
const string Manager = "Manager";
string[] roles = { Manager };
foreach (var role in roles)
{
var roleExist = await roleManager.RoleExistsAsync(role);
if (!roleExist)
{
await roleManager.CreateAsync(new IdentityRole(role));
}
}
var user = await userManager.FindByEmailAsync(config.GetValue<string>("AdminUser"));
if (user != null)
{
await userManager.AddToRoleAsync(user, Manager);
}
}
}
允许将适当的用户标记为管理员。该页面上具有[AllowAnonymous]标记,以便允许appsettings.json页面中“ AdminUser”:“ SomeEmail@test.com”指示的管理用户能够在初始设置时访问该站点。 / p>
防止匿名用户访问Blazor站点本身就像将这一行添加到启动类中的ConfigureServices一样简单(代码取自Microsoft Docs)
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
由此,允许访问注册页面比我最初想象的要容易得多(可能是由于缺乏.net经验)。为此,您所需要做的就是找到Register.cshtml.cs页面(我最初找不到Muhammad提到的控制器方法),这是通过使用Visual Studio右键单击Register Model然后转到定义。这应该带您到RegisterModel类的Register.cshtml.cs页面。为了只限制特定角色的用户访问此页面,您要做的就是更改类上方的[AllowAnonymous]标记,使其看起来与此类似:
[Authorize(Roles ="Manager")]
public class RegisterModel : PageModel
重要的是要注意,用于保护注册页面的相同技术可用于保护任何其他支架式身份页面。对于您可能拥有多个角色的应用程序,Muhammad提供的使用基于策略的授权的方法可能是可行的方法,this link he provided是设置和使用这种身份验证形式的很好的教程。< / p>
答案 2 :(得分:0)
//FORCE autentication for all RAZOR PAGES except [AllowAnonymous]
services.AddControllers(config => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
仅将此代码添加到我的startup.cs中即可解决我的问题。