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