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

时间:2020-08-05 16:02:43

标签: asp.net-core asp.net-identity blazor

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

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

3 个答案:

答案 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中即可解决我的问题。