自定义角色存储 asp.net

本文关键字:net asp 存储 角色 自定义 | 更新日期: 2023-09-27 18:31:08

我点击了这个链接,并试图制作我自己的角色,因为我使用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  
{
}

之后,应用程序管理器类如下所示

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;
    }
}

最后一点是当我在中创建管理器时

启动类,像这样

 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);
    }

用户角色管理器的定义如下

    public ApplicationRoleManager UserRoleManager
    {
        get
        {
            return _userRoleManager ?? Request.GetOwinContext().Get<ApplicationRoleManager>();
        }
        private set
        {
            _userRoleManager = value;
        }
    }

创建角色后,我无法看到它。我尝试做

UserRoleManager.Roles.Count();

但它给了我这个错误

"Store 不实现 IQueryableRoleStore。

有谁知道我在这里错过了什么?

自定义角色存储 asp.net

您的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>