将帐户注册限制为仅具有asp.net身份验证的管理员用户



我正在创建一个Blazor服务器应用程序,该应用程序需要经过身份验证的用户才能防止外部访问,我希望将注册新帐户的功能限制为仅对管理员用户可用,以防止创建不需要的帐户。

我使用的是为Blazor搭建的Identity用户帐户。像这样的解决方案至少会禁用注册,但从那时起,我需要能够再次为管理用户启用它。我试图将注册页面重新创建为Blazor组件,但是,使用生成的RegisterModel似乎对我不起作用

经过大量搜索,答案相对简单。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]标签,以便允许管理用户按照";AdminUser":"SomeEmail@test.com&";,在appsettings.json页面中,以便能够在初始设置时访问该网站。

防止匿名用户访问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提供的使用基于策略的授权的方法可能是可行的,他提供的这个链接是设置和使用这种形式的身份验证的一个很好的教程。

//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中就解决了我的问题。

以下是我在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
}

最新更新