В настоящее время я пытаюсь заставить UserRoles
работать в ASP.NET. Я столкнулся с некоторыми проблемами. По какой-то причине он, похоже, не забирает роли из БД.
Я изменяю имя таблицы для удовлетворения моего требования, используя следующий код в IdentityModels.cs
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUserRole>().ToTable("MyRroles");
}
Сначала он не смог найти схему и после некоторых исследований я следил за этой статьей и эта конкретная ошибка исчезла. Однако после статьи она добавила следующие таблицы в моей БД
aspnet_Applications
aspnet_Roles
aspnet_SchemaVersions
aspnet_Users
aspnet_UsersInRoles
Который мне не нужен. Я делаю базовую инструкцию if
чтобы проверить, не работают ли роли. И, похоже, он не поднимает роли.
if(Roles.RoleExists("RoleName"))
{
Button1.Visible = false;
}
В моем файле web.config
меня есть следующий код
<roleManager defaultProvider="MyConn" enabled="true">
<providers>
<add
name="MyConn"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="MyConn"
applicationName="MyApp"/>
</providers>
</roleManager>
Может ли кто-нибудь сказать мне, где я ошибаюсь, пожалуйста. Спасибо за вашу помощь и поддержку.
Если вы хотите сделать a basic if statement to check whether the roles are working of not
тогда, вам нужно где-то хранить роли, правильно? И поскольку вы хотите использовать поставщик ролей по умолчанию, вам нужны эти SQL-таблицы. Поставщик по умолчанию в System.Web.Security.SqlRoleProvider
использует их. Поскольку Roles.RoleExists("RoleName")
будут искать эти таблицы, чтобы узнать, назначен ли текущий пользователь роли RoleName
.
Если вы хотите изменить способ назначения роли роли, вам необходимо реализовать собственный поставщик ролей.
Вот пример:
public class MyRoleProvider : RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
// your logic here
}
public override bool IsUserInRole(string username, string roleName)
{
// your logic here
}
public override string[] GetAllRoles()
{
// your logic here
}
public override bool RoleExists(string roleName)
{
// your logic here
}
// etc...
}
Проверьте эту статью на наличие всех доступных методов: http://msdn.microsoft.com/en-us/library/8fw7xh74(v=vs.100).aspx.
Затем, чтобы настроить приложение для использования вашего провайдера, просто обновите файл web.config:
<roleManager defaultProvider="MyRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="3" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
<providers>
<clear />
<add name="MyRoleProvider" type="MyNamespace.MyRoleProvider" connectionStringName="DefaultConnection" applicationName="MyAppName" writeExceptionsToEventLog="false" />
</providers>
</roleManager>
Конечно, вам нужно обновить код с помощью собственного пространства имен, параметров и т.д....
После этого ваш код в Roles.RoleExists("RoleName")
выполнит метод RoleExists
из вашего поставщика роли.
System.Web.Security.SqlRoleProvider
использует эти таблицы, которые у меня были в моей БД с самого начала. Однако, когда я запускаю Aspnet_regsql.exe
он генерирует те же самые таблицы, но в нижнем регистре: / И если я не запускаю Aspnet_regsql.exe
я получаю ошибку, couldn't find the schema
The 'System.Web.Security.SqlRoleProvider' requires a database schema compatible with schema version '1'