Я занимаюсь разработкой приложений MVC 5 с поставщиком пользовательских ролей, но мне кажется, что AuthorizeAttribute никогда не называйте моего клиента поставщика роли, мой код, как показано ниже:Пользовательские роли поставщика имеет проблемы с AuthorizeAttribute для MVC
Мой поставщик клиентов :
namespace MyDomain
{
public class CustomRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
using (MyContext objContext = new MyContext())
{
var objUser = objContext.Users.FirstOrDefault(x => x.Username == username);
if (objUser == null)
{
return null;
}
else
{
string[] ret = { objUser.Access_Levels.Name };
return ret;
}
}
}
public override bool IsUserInRole(string username, string roleName)
{
var userRoles = GetRolesForUser(username);
return userRoles.Contains(roleName);
}
}
Мой контроллер:
[Authorize(Roles = "Administrator")]
public class AdminController : Controller
И Web.Config:
<system.web>
<roleManager defaultProvider="CustomRoleProvider" enabled="true" >
<providers>
<clear />
<add name="CustomRoleProvider" type="Online_Storage_Portal.CustomRoleProvider" cacheTimeoutInMinutes="30"/>
</providers>
</roleManager>
</system.web>
Кроме того, мой пользовательский поставщик роль в том же проекте, как мои другие контроллеры, я могу назвать свой собственный метод поставщика роли с помощью следующего кода в мой контроллер
String [] = роли Roles.GetRolesForUser (имя пользователя)
но контроллер с [Авторизовать (Roles = «Administrator»)] всегда перенаправляет страницу на экран входа, даже если имя пользователя и роль оценены.
Пожалуйста, помогите!
Спасибо за ваш комментарий Дэн. Я смог сделать то же самое, кроме использования ClientPrincipal, которые перекрывают метод WindowsPrincipal IsInRole, чтобы обеспечить дополнительную функциональность. https://dotnetfiddle.net/sTU8EQ –
То же самое здесь. Дэн, ты мужчина. Не знал об аутентификации сообщения, концепции обертывания WindowsPrincipal или о том, что по умолчанию impl просто использовал кешированные роли. – Visser