【问题标题】:Assign roles to identity from database将角色分配给数据库中的身份
【发布时间】:2020-08-16 03:37:44
【问题描述】:

我正在编写一个 blazor 站点,该站点需要允许基于预先存在的 SQL 数据库中的记录访问某些页面。我一直在研究需要什么,但大部分都找到了为 .Net Core 1.0 执行此操作的说明,但 2.0 及更高版本的过程发生了变化,我无法找到我需要做什么的完整图片。

我的网站使用 Windows 身份验证。我用这个修改了一个页面:@attribute [Authorize(Roles="Editor")]。我添加了一个 IClaimsTransformation 实现,如下所示:

public class ClaimsTransformer : IClaimsTransformation {

    private readonly Model model;

    public ClaimsTransformer(Model model) {
        this.model = model;
    }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) {
        var cp = principal.Clone();
        var identity = (ClaimsIdentity)cp.Identity;
        var userName = identity.Name;
        var usec = await model.ApprovalUsers.SingleOrDefaultAsync(r => EF.Functions.Like(r.Login, userName));
        if (usec != null) {
            if (usec.IsEditor) identity.AddClaim(new Claim(ClaimTypes.Role, "Editor"));
        }
        return cp;
    }
}

模型是 EF Core 模型。为了让事情更简单,我暂时删除了除编辑器声明之外的所有内容。

以下是我的配置服务:

    public void ConfigureServices(IServiceCollection services) {
        services.AddRazorPages();
        services.AddScoped<IClaimsTransformation, ClaimsTransformer>();
        services.AddDbContext<Model>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);
        services.AddBlazoredToast();
        services.AddServerSideBlazor();
        services.AddAuthorization(opt => {
            opt.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
            opt.AddPolicy("Editor", policy => policy.RequireClaim("Editor"));
        });
    }

这是我的配置:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {

        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        } else {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseAuthentication();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints => {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
        });
    }

当我导航到具有授权属性的页面时,我收到“未授权”消息,但我的 IClaimsTransformation 实现从未被调用。我不确定是否需要向 ConfigureServices 添加一些内容以将其注册到授权系统(以及将其注册为范围服务)。我也不相信这是实现我想要做的事情的正确方法:

        services.AddAuthorization(opt => {
            opt.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
            opt.AddPolicy("Editor", policy => policy.RequireClaim("Editor"));
        });

谁能指出我正确的方向?

【问题讨论】:

    标签: authorization blazor-server-side asp.net-core-3.1


    【解决方案1】:

    好的,看来答案是在 ConfigureServices 中有以下行:

                services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme);
    

    而不是简单

    services.AddAuthentication();
    

    我认为,由于应用程序知道我的 Windows 凭据,因此已成功进行身份验证,但我想没有。

    此外,不需要政策的东西 - 显然是事后诸葛亮,因为我使用的是角色而不是政策。我想我当时尝试了很多排列,以至于我忘记了我想要实现的目标

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2019-02-26
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多