Цикл перенаправления с атрибутом.Net MVC Authorize с утверждениями ADFS
У меня проблема с настройкой ADFS в приложении.Net MVC 5.
Я настроил свой проект в VS 2015 для использования утверждений, и он работает нормально, но у меня есть проблема.
Я могу войти, используя ADFS, я могу проверить роли пользователей и т. Д. Проблема возникает, когда я пытаюсь использовать
[Authorize(Roles="somenonExistingRole")]
несмотря на то, что я уже аутентифицирован, я перенаправлен на страницу ADFS, когда аутентификация повторяется, и я перенаправлен на мою страницу, где происходит цикл. Страница отправляет меня на портал ADFS, ADFS перенаправляет мой на портал, и после нескольких попыток я получаю сообщение об ошибке из ADFS (на многие запросы)
Должен ли я сам реализовать что-то вроде провайдера ролей? или мне нужно настроить что-то дополнительное. Может быть, я мог бы просто ограничить количество попыток? Почему я перенаправлен в ADFS, когда у меня уже есть свои роли?
на самом деле в коде не так много информации, которая была бы запрошена: контроллер, который я тестирую:
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();
}
}
и настроить раздел авторизации
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
требования. Это инициализирует запрос на повторную аутентификацию для провайдера идентификации. Поскольку пользователь уже вошел в систему, 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);
}
}
}