自定义角色存储 asp.net
Custom role storage asp.net
我遵循了这个 link 并尝试制作我自己的角色,因为我使用 Azure 作为存储而不是 Sql。
public interface IApplicationUserRole : IRole<string>
{
}
public class EntityUserRoleStore<TRole> : IRoleStore<TRole,string>, IRoleStore<TRole>
where TRole : class, IApplicationUserRole, new()
{
static List<TRole> roles = new List<TRole>();
public async Task CreateAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Add(role);
// return Task.FromResult<object>(null);
}
public async Task DeleteAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Remove(role);
}
public void Dispose()
{
}
public async Task<TRole> FindByIdAsync(string roleId)
{
if (roleId == null)
{
throw new ArgumentNullException("role");
}
return roles.Where(i => i.Id == roleId).FirstOrDefault();
}
public async Task<TRole> FindByNameAsync(string roleName)
{
if (roleName == null)
{
throw new ArgumentNullException("role");
}
return roles.Where(i => i.Name == roleName).FirstOrDefault();
}
public async Task UpdateAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Where(i => i.Id == role.Id).FirstOrDefault().Name = role.Name;
}
}
然后应用程序角色模型如下所示
public class ApplicationRole : IdentityRole, IApplicationUserRole
{
}
之后应用程序管理器 class 看起来像这样
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(IRoleStore<ApplicationRole> store)
: base(store)
{
}
public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
var manager = new ApplicationRoleManager(new EntityUserRoleStore<ApplicationRole>());
return manager;
}
}
最后一点是我在
中创建管理器
Startup class, like this
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
}
完成所有这些配置后,我试图在我的测试控制器中创建这样的角色
public void CreateRole(string roleName)
{
var role = new ApplicationRole() { Name = roleName, Id = Suid.NewSuid().ToString() };
IdentityResult result = UserRoleManager.Create(role);
}
UserRoleManager 是这样定义的
public ApplicationRoleManager UserRoleManager
{
get
{
return _userRoleManager ?? Request.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_userRoleManager = value;
}
}
创建角色后我看不到它。我试着做
UserRoleManager.Roles.Count();
但它给了我这个错误
"Store does not implement IQueryableRoleStore."
有人知道我在这里错过了什么吗?
您的 EntityUserRoleStore
需要实现 IQueryableRoleStore
接口。
替换以下内容:
public class EntityUserRoleStore<TRole> : IRoleStore<TRole,string>, IRoleStore<TRole>
有了这个:
public class EntityUserRoleStore<TRole> : IQueryableRoleStore<TRole>
请注意,这将要求您实现接口,包括似乎缺失的 public IQueryable<TRole> Roles
。
如果你的主键是一个字符串,上面的方法就可以了,如果它是不同的,你需要实现相关的接口。下面是一个 guid 的例子。
public class OracleRoleStore<TRole> : IQueryableRoleStore<TRole, Guid>
我遵循了这个 link 并尝试制作我自己的角色,因为我使用 Azure 作为存储而不是 Sql。
public interface IApplicationUserRole : IRole<string>
{
}
public class EntityUserRoleStore<TRole> : IRoleStore<TRole,string>, IRoleStore<TRole>
where TRole : class, IApplicationUserRole, new()
{
static List<TRole> roles = new List<TRole>();
public async Task CreateAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Add(role);
// return Task.FromResult<object>(null);
}
public async Task DeleteAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Remove(role);
}
public void Dispose()
{
}
public async Task<TRole> FindByIdAsync(string roleId)
{
if (roleId == null)
{
throw new ArgumentNullException("role");
}
return roles.Where(i => i.Id == roleId).FirstOrDefault();
}
public async Task<TRole> FindByNameAsync(string roleName)
{
if (roleName == null)
{
throw new ArgumentNullException("role");
}
return roles.Where(i => i.Name == roleName).FirstOrDefault();
}
public async Task UpdateAsync(TRole role)
{
if (role == null)
{
throw new ArgumentNullException("role");
}
roles.Where(i => i.Id == role.Id).FirstOrDefault().Name = role.Name;
}
}
然后应用程序角色模型如下所示
public class ApplicationRole : IdentityRole, IApplicationUserRole
{
}
之后应用程序管理器 class 看起来像这样
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(IRoleStore<ApplicationRole> store)
: base(store)
{
}
public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
var manager = new ApplicationRoleManager(new EntityUserRoleStore<ApplicationRole>());
return manager;
}
}
最后一点是我在
中创建管理器Startup class, like this
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
}
完成所有这些配置后,我试图在我的测试控制器中创建这样的角色
public void CreateRole(string roleName)
{
var role = new ApplicationRole() { Name = roleName, Id = Suid.NewSuid().ToString() };
IdentityResult result = UserRoleManager.Create(role);
}
UserRoleManager 是这样定义的
public ApplicationRoleManager UserRoleManager
{
get
{
return _userRoleManager ?? Request.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_userRoleManager = value;
}
}
创建角色后我看不到它。我试着做
UserRoleManager.Roles.Count();
但它给了我这个错误
"Store does not implement IQueryableRoleStore."
有人知道我在这里错过了什么吗?
您的 EntityUserRoleStore
需要实现 IQueryableRoleStore
接口。
替换以下内容:
public class EntityUserRoleStore<TRole> : IRoleStore<TRole,string>, IRoleStore<TRole>
有了这个:
public class EntityUserRoleStore<TRole> : IQueryableRoleStore<TRole>
请注意,这将要求您实现接口,包括似乎缺失的 public IQueryable<TRole> Roles
。
如果你的主键是一个字符串,上面的方法就可以了,如果它是不同的,你需要实现相关的接口。下面是一个 guid 的例子。
public class OracleRoleStore<TRole> : IQueryableRoleStore<TRole, Guid>