Цикл перенаправления с атрибутом авторизации .Net MVC с требованиями ADFS

У меня проблема с настройкой ADFS с моим .Net MVC 5.

Я сконфигурировал свой проект в VS 2015 для использования претензий, и он работает нормально, но у меня есть проблема.

Я могу войти, используя ADFS, я могу проверить роли пользователя и т.д. Проблема возникает, когда я пытаюсь использовать

[Authorize(Roles="somenonExistingRole")]

несмотря на то, что я уже прошел проверку подлинности, я перенаправлен на страницу ADFS, когда аутентификация происходит снова, и я перенаправлен на мою страницу, где происходит цикл. Страница отправляет меня на портал ADFS, ADFS перенаправляет мой на портал, и после нескольких попыток я получаю сообщение об ошибке из ADFS (для многих запросов)

Нужно ли мне реализовать что-то вроде роли-провайдера? или мне нужно настроить что-то дополнительное. Может быть, я могу просто ограничить количество попыток? Почему я перенаправлен в ADFS, когда у меня есть мои роли allready?

не так много, чтобы показать актуальность в коде, ut в соответствии с запросом: контроллер, который испытывает im:

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        [Authorize]
        public ActionResult About()
        {
            var u = HttpContext.User;


            if (u.IsInRole("/"))
            {
                ViewBag.Message = "User is in role.";
            }
            else
            {
                ViewBag.Message = "User is NOT in role.";
            }

            return View();
        }
        [Authorize(Roles = "/nonexistingRole")]
        public ActionResult Contact()
        {

            ViewBag.Message = "Your contact page.";

            return View();
        }
    }

и раздел конфигурации auth

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseWsFederationAuthentication(
        new WsFederationAuthenticationOptions
        {
            Wtrealm = realm,
            MetadataAddress = adfsMetadata, 

        });
}

Ответ 1

Чтобы исправить проблему цикла, вы должны переопределить AuthorizeAttribute.

По умолчанию MVC возвращает 401 Unauthorized, когда роли пользователя не соответствуют требованиям AuthorizeAttribute. Это инициализирует запрос на повторную аутентификацию для провайдера идентификации. Поскольку пользователь уже вошел в систему, AAD возвращается на ту же страницу, которая затем выдает еще 401, создавая цикл перенаправления. Здесь мы переопределяем метод AuthorizeAttribute HandleUnauthorizedRequest, чтобы показать что-то, что имеет смысл в контексте нашего приложения.

Этот класс был создан при создании нового проекта MVC с использованием VS 2015:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{        
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            //One Strategy:
            //filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);

            //Another Strategy:
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        controller = "Error",
                        action = "ShowError",
                        errorMessage = "You do not have sufficient priviliges to view this page."
                    })
                );
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}