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


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

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

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

[Authorize(Roles="somenonExistingRole")]

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

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

В коде на самом деле мало что можно показать, 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();
        }
    }

И раздел configure auth

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

    app.UseCookieAuthentication(new CookieAuthenticationOptions());

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

        });
}
1 10

1 ответ:

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

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

Этот класс был создан при создании нового проекта 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);
        }
    }
}