Asp.net mvc 授权属性adal签出MVC

Asp.net mvc 授权属性adal签出MVC,asp.net-mvc,azure-active-directory,adal,Asp.net Mvc,Azure Active Directory,Adal,我已经基于MVC中的AAD组创建了一个自定义授权属性。如果我在属性中返回false,应用程序将进入登录页面上的无限循环。在MVC应用程序中使用adal时,如何从自定义授权属性注销用户?当用户经过身份验证但没有角色(自定义属性中返回false)时,授权属性会将响应更改为401。只有当用户经过身份验证并且具有角色(在自定义属性中返回true)时,authorize属性才不会更改响应 I think I found a solution I am testing as we speak: prot

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

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

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;
    }
如果您正在使用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方法在自定义授权属性中重定向未经授权的用户:

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

请阅读以了解更多详细信息。

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