使用身份的自定义存储提供程序实现角色
Implementing roles with custom storage provider for Identity
最近,我成功地为应用程序实现了身份验证(使用 WS-Federation 的 ADFS 的 SSO)。现在,我正在尝试理解并获得授权,所以这个问题可能不清楚。
我正在使用 this topic 来实现具有身份的自定义存储提供程序的角色,而没有 entity framework。
我已经设置了自定义 User
和 Role
模型,以及实现适当接口的自定义 UserStore
和 RoleStore
。还有准备好使用的角色表。
我 运行 在尝试访问 [Authorized]
或 [Authorized(Roles = "RoleName")]
时遇到问题。正如预期的那样,这些操作要求我使用 ADFS 进行身份验证,但是当我提交正确的凭据时,登录会循环几次并显示 ADFS 错误页面。如果没有角色实现,ADFS 不会出现此问题。 UserStore
和 RoleStore
尚未实现代码,但应用程序从未尝试使用它们的任何方法。
我尝试在 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。
然后您需要的自定义属性存储的角色等可以配置为声明。
最近,我成功地为应用程序实现了身份验证(使用 WS-Federation 的 ADFS 的 SSO)。现在,我正在尝试理解并获得授权,所以这个问题可能不清楚。
我正在使用 this topic 来实现具有身份的自定义存储提供程序的角色,而没有 entity framework。
我已经设置了自定义 User
和 Role
模型,以及实现适当接口的自定义 UserStore
和 RoleStore
。还有准备好使用的角色表。
我 运行 在尝试访问 [Authorized]
或 [Authorized(Roles = "RoleName")]
时遇到问题。正如预期的那样,这些操作要求我使用 ADFS 进行身份验证,但是当我提交正确的凭据时,登录会循环几次并显示 ADFS 错误页面。如果没有角色实现,ADFS 不会出现此问题。 UserStore
和 RoleStore
尚未实现代码,但应用程序从未尝试使用它们的任何方法。
我尝试在 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。
然后您需要的自定义属性存储的角色等可以配置为声明。