AuthorizeAttribute adal signout MVC

时间:2017-07-06 07:12:10

标签: asp.net-mvc azure-active-directory adal

我已经在MVC中基于AAD组创建了自定义Authorize属性。如果我在属性中返回false,则应用程序会在登录页面上进入无限循环。在MVC应用程序中使用adal时,如何从自定义授权属性中注销用户?

2 个答案:

答案 0 :(得分:2)

当用户通过身份验证但没有角色(自定义属性中返回false)时,authorize属性会将响应更改为401.仅当用户通过身份验证并具有角色时(true在自定义属性中返回) authorize属性不会改变响应。

如果您正在使用FormsAuthentication或OWIN Cookie身份验证中间件并且用户已经登录,他将再次被重定向到登录页面,如果您对此有所了解,这有点奇怪。 “我已经登录了,现在我回来登录页面只是因为我点击了一些链接,没有人告诉我为什么会发生这种情况。”

AuthorizeAttribute提供了一个名为HandleUnauthorizedRequest的受保护虚拟方法,您可以覆盖该方法,检查用户是否经过身份验证并显示错误页面。例如:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden);
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }

您还可以通过覆盖HandleUnauthorizedRequest方法在自定义AuthorisationAttribute中重定向未经授权的用户:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                        { 
                            controller = "Error", 
                            action = "Unauthorised" 
                        })
                );
}

请阅读here了解详情。

答案 1 :(得分:1)

I think I found a solution I am testing as we speak: 

protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);

        var allowedGroups = GetAllowedGroups();

        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
        string callbackUrl = urlHelper.Action("SignOutCallback", "Account", routeValues: null, protocol: httpContext.Request.Url.Scheme);

        httpContext.GetOwinContext().Authentication.SignOut(
            new AuthenticationProperties { RedirectUri = callbackUrl },
            OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);

        return authorized;
    }