使用身份的自定义存储提供程序实现角色

Implementing roles with custom storage provider for Identity

最近,我成功地为应用程序实现了身份验证(使用 WS-Federation 的 ADFS 的 SSO)。现在,我正在尝试理解并获得授权,所以这个问题可能不清楚。

我正在使用 this topic 来实现具有身份的自定义存储提供程序的角色,而没有 entity framework。

我已经设置了自定义 UserRole 模型,以及实现适当接口的自定义 UserStoreRoleStore。还有准备好使用的角色表。

我 运行 在尝试访问 [Authorized][Authorized(Roles = "RoleName")] 时遇到问题。正如预期的那样,这些操作要求我使用 ADFS 进行身份验证,但是当我提交正确的凭据时,登录会循环几次并显示 ADFS 错误页面。如果没有角色实现,ADFS 不会出现此问题。 UserStoreRoleStore 尚未实现代码,但应用程序从未尝试使用它们的任何方法。

我尝试在 Startup.cs 中实施不同的选项,其中一些我已注释掉,并重新订购服务。将伪代码插入 RoleStore 也无济于事。基本上,我只想能够使用 Identity 从自定义存储中添加 role checks。我可以在他们登录后随时获取用户的用户名以找到他们的角色。

Startup.cs ConfigureServices 方法是我最不清楚的地方,也可能是最有可能设置不正确的地方。

Startup.cs 配置服务():

public void ConfigureServices(IServiceCollection services)
{
    // Add identity types
    services.AddIdentity<User, Role>()
        //.AddUserManager<UserManager<User>>() // some other settings I've tried ...
        //.AddRoleManager<RoleManager<Role>>()
        //.AddUserStore<UserStore>()
        //.AddRoleStore<RoleStore>()
        //.AddRoles<Role>()
        .AddDefaultTokenProviders();

    // Identity Services
    services.AddTransient<IUserStore<User>, UserStore>();
    services.AddTransient<IRoleStore<Role>, RoleStore>();
    //for SQL connection, I'll be using a different one (not the one from the link to topic)

    //dependency injection
    services.AddScoped<ISomeService, SomeService>();

    services.AddAuthentication(sharedOptions =>
    {
        // authentication options...
    })
    .AddWsFederation(options =>
    {
        // wsfed options...
    })
    .AddCookie(options =>
    {
        options.Cookie.Name = "NameOfCookie";
        //options.LoginPath = "/Access/Login"; //app function the same without this
        options.LogoutPath = "/Access/Logout";
        options.AccessDeniedPath = "/Access/AccessDenied";
        options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
        options.SlidingExpiration = true;
    });

    services.AddControllersWithViews();
}

另一种方法是向 ADFS 添加 custom attribute store

然后您需要的自定义属性存储的角色等可以配置为声明。