我在使用.Net MVC 5应用程序配置ADFS时遇到问题。

我已经在VS 2015中将我的项目配置为使用声明,并且可以正常运行,但是我遇到了问题。

我可以登录,使用ADFS,可以检查用户角色等。尝试使用该问题时会发生

[Authorize(Roles="somenonExistingRole")]

尽管我已经通过身份验证,但再次进行身份验证后,我仍被重定向到ADFS页面,并且我也重定向到发生循环的页面。页面将我发送到ADFS门户,ADFS将我重定向到门户,经过几次尝试,我从ADFS中收到错误(针对许多请求)

我是否必须自己实现类似角色提供程序的事情?或者我需要配置一些额外的东西。也许我可以限制尝试次数?准备好角色后,为什么要重定向到ADFS?

在代码中没有多少要显示实际值,如要求的那样:
我正在测试的 Controller :
 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,

        });
}

最佳答案

要解决循环问题,您应该覆盖AuthorizeAttribute

默认情况下,当用户的角色不符合AuthorizeAttribute要求时,MVC返回401 Unauthorized。这将初始化向身份提供者的重新认证请求。由于用户已经登录,因此AAD返回到同一页面,然后发布另一个页面 401,从而创建重定向循环。在这里,我们重写了AuthorizeAttribute的HandleUnauthorizedRequest方法,以显示在我们的应用程序上下文中有意义的内容。

此类是在使用VS 2015创建新的MVC项目时生成的:

[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);
        }
    }
}

关于.net - 带有ADFS声明的.Net MVC Authorize属性的重定向循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34941877/

10-12 15:19