如何将自定义角色管理器插入 AuthorizeAttribute?
How do I plug a custom roles manager into the AuthorizeAttribute?
我有一个无法更改的旧数据库架构。它有一个用户 table 和一个整数字段来指定用户级别,其中 1 是标准用户,5 是管理员。我正在编写一个 MVC 前端,我想使用 ASP.NET Identity。我已经从研究和样板代码中找出了其他所有内容。我似乎无法弄清楚如何创建自定义角色系统。我意识到这与实施角色管理器和角色存储有关。这很好,但我如何将它与 MVC 连接起来,让 AuthorizeAttribute
确认我的经理?
如果这很明显,我深表歉意,但我已经完成了研究,但无法确定。
从你的问题来看,我假设你已经想出了如何创建你的角色管理器,你只是缺少实际使用它的配置。如果我的假设有误,请告诉我,我将添加有关如何创建 CustomRoleManager 的说明。
Web.config
<configuration>
<system.web>
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
<providers>
<clear/>
<add name="CustomRoleProvider"
type="MyNamespace.CustomRoleProvider,
MyNamespace, Version=1.0.0.0, Culture=neutral"
connectionStringName="MyConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
writeExceptionsToEventLog="false" />
</providers>
</roleManager>
</system.web>
</configuration>
这是我用的RoleProvider
,如果有人有同样的琐碎需求。如果您知道此实施不安全的任何原因,请告诉我。我在我的 Web.Config 中使用@Pluc 的回答将此提供程序连接到我的应用程序。效果非常好。
public class AppRole : IRole<int>
{
public AppRole(int a_id, string a_name)
{
Id = a_id;
Name = a_name;
}
public int Id { get; private set; }
public string Name { get; set; }
}
public class AppRoleProvider : RoleProvider
{
private readonly IServiceLocator _container = UnityConfig.GetServiceLocator();
private ITrainingRepository _repository; // Thin wrapper around my DbContext
private AppRole[] _roles = new[]
{
new AppRole(0, "User"),
new AppRole(5, "Admin"),
};
public AppRoleProvider()
{
ApplicationName = "TrainingCenter";
_repository = _container.GetInstance<ITrainingRepository>();
}
public override string ApplicationName { get; set; }
public override bool IsUserInRole(string username, string roleName)
{
var user = _repository.GetUserByUserName(username);
if (user == null)
return false;
var role = _roles.FirstOrDefault(i => i.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
if (role == null)
return false;
if (user.UserLevel >= role.Id)
return true;
return false;
}
public override string[] GetRolesForUser(string username)
{
var user = _repository.GetUserByUserName(username);
if (user == null)
return new string[] {};
return _roles.Where(i => i.Id <= user.UserLevel).Select(i => i.Name).ToArray();
}
public override void CreateRole(string roleName)
{
// Does not create.
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
// Does not delete.
return false;
}
public override bool RoleExists(string roleName)
{
return _roles.Any(i => i.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
// Does not add user to role.
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
// Does not remove users from roles.
}
public override string[] GetUsersInRole(string roleName)
{
// Does not get users in role.
return new string[] {};
}
public override string[] GetAllRoles()
{
return _roles.Select(i => i.Name).ToArray();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
// Does not find users in role.
return new string[] { };
}
}
我有一个无法更改的旧数据库架构。它有一个用户 table 和一个整数字段来指定用户级别,其中 1 是标准用户,5 是管理员。我正在编写一个 MVC 前端,我想使用 ASP.NET Identity。我已经从研究和样板代码中找出了其他所有内容。我似乎无法弄清楚如何创建自定义角色系统。我意识到这与实施角色管理器和角色存储有关。这很好,但我如何将它与 MVC 连接起来,让 AuthorizeAttribute
确认我的经理?
如果这很明显,我深表歉意,但我已经完成了研究,但无法确定。
从你的问题来看,我假设你已经想出了如何创建你的角色管理器,你只是缺少实际使用它的配置。如果我的假设有误,请告诉我,我将添加有关如何创建 CustomRoleManager 的说明。
Web.config
<configuration>
<system.web>
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
<providers>
<clear/>
<add name="CustomRoleProvider"
type="MyNamespace.CustomRoleProvider,
MyNamespace, Version=1.0.0.0, Culture=neutral"
connectionStringName="MyConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
writeExceptionsToEventLog="false" />
</providers>
</roleManager>
</system.web>
</configuration>
这是我用的RoleProvider
,如果有人有同样的琐碎需求。如果您知道此实施不安全的任何原因,请告诉我。我在我的 Web.Config 中使用@Pluc 的回答将此提供程序连接到我的应用程序。效果非常好。
public class AppRole : IRole<int>
{
public AppRole(int a_id, string a_name)
{
Id = a_id;
Name = a_name;
}
public int Id { get; private set; }
public string Name { get; set; }
}
public class AppRoleProvider : RoleProvider
{
private readonly IServiceLocator _container = UnityConfig.GetServiceLocator();
private ITrainingRepository _repository; // Thin wrapper around my DbContext
private AppRole[] _roles = new[]
{
new AppRole(0, "User"),
new AppRole(5, "Admin"),
};
public AppRoleProvider()
{
ApplicationName = "TrainingCenter";
_repository = _container.GetInstance<ITrainingRepository>();
}
public override string ApplicationName { get; set; }
public override bool IsUserInRole(string username, string roleName)
{
var user = _repository.GetUserByUserName(username);
if (user == null)
return false;
var role = _roles.FirstOrDefault(i => i.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
if (role == null)
return false;
if (user.UserLevel >= role.Id)
return true;
return false;
}
public override string[] GetRolesForUser(string username)
{
var user = _repository.GetUserByUserName(username);
if (user == null)
return new string[] {};
return _roles.Where(i => i.Id <= user.UserLevel).Select(i => i.Name).ToArray();
}
public override void CreateRole(string roleName)
{
// Does not create.
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
// Does not delete.
return false;
}
public override bool RoleExists(string roleName)
{
return _roles.Any(i => i.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
// Does not add user to role.
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
// Does not remove users from roles.
}
public override string[] GetUsersInRole(string roleName)
{
// Does not get users in role.
return new string[] {};
}
public override string[] GetAllRoles()
{
return _roles.Select(i => i.Name).ToArray();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
// Does not find users in role.
return new string[] { };
}
}