【问题标题】:AuthorizeAttribute adal signout MVCAuthorizeAttribute adal 注销 MVC
【发布时间】:2017-07-06 15:49:36
【问题描述】:

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

【问题讨论】:

  • 我认为您在此有点混淆了顾虑。授权属性应该检查用户是否被授权执行操作,并允许他们通过或返回某种不允许他们这样做的错误。为什么需要将它们注销?
  • 感谢您的回复。如果用户不是特定 AAD 组的成员,则我返回 false,因为我不想授权用户。如果您使用 ADAL/OWIN 作为身份验证并从自定义授权属性返回 false,则应用程序将向您的登录页面和您的应用程序启动无限循环。
  • 是的,您通常不希望在授权失败时导致重定向到 AAD(它将以您的浏览器作为球,您的应用程序和 AAD 作为球拍开始一场网球比赛)。相反,您应该向用户显示错误页面。
  • 顺便说一句,它总是让用户退出,只是为了测试目的:D
  • 甚至更好:

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


【解决方案1】:

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

如果您使用 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了解更多详情。

【讨论】:

  • 这就是要走的路!那是一个更好的解决方案。谢谢!
【解决方案2】:
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;
    }

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 2017-09-21
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2017-11-07
    相关资源
    最近更新 更多