如何基于区域将未经授权的用户重定向到登录页面?

3

我有一个ASP.NET MVC5网站,将被分为公共和管理部分。

公共部分可以选择性地进行认证,某些视图只限于具有适当角色的已认证用户。如果用户尝试访问未经授权或没有适当角色的公共控制器,则希望将其重定向到“public”登录页面。

只需使用简单的属性即可实现此目的:

[Authorize(Roles = "Organizer")]

但是,如果用户尝试访问管理员区域中的任何内容,并且未经过身份验证,或者经过身份验证但没有“管理员”的角色,则希望将其重定向到不同的登录屏幕。 (https://localhost:44300/Admin/Account/Login而不是https://localhost:44300/Account/Login)。

是否有一种简单的方法应用整个区域的替代登录重定向?


你可以编写自己的自定义授权属性。 - Sirwan Afifi
1个回答

11

您可以创建自定义的授权属性,因此在HandleUnauthorizedRequest中,您可以根据区域名称将未经授权的用户重定向到特定的登录页面:

您可以创建一个自定义的授权属性,这样在HandleUnauthorizedRequest中,您就可以根据区域名将未经授权的用户重定向到特定的登录页面:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            var areaName = filterContext.RouteData.DataTokens["area"];
            if (areaName.Equals("Admin"))
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new {controller = "Account", action = "Login", area = "Admin"}));
            }
            else if(areaName.Equals("Public"))
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new { controller = "Account", action = "Login" }));
            }
           // other conditions...

        }
    }
}

你可以看到,我们使用了以下代码来获取当前区域名称:

var areaName = filterContext.RouteData.DataTokens["area"];

如果您正在使用aspnet rc2 Microsoft.AspNetCore.Authorization,那么您无法重写任何虚拟函数。抱歉。 - conterio
那么在AspNetCore的情况下,你会怎么做呢,@JeremyConterio? - Saca
1
@Saca,他们已经将其删除。请查看此链接,他解释了为什么以及解决方法。 https://blogs.msdn.microsoft.com/webdev/2016/03/15/get-started-with-asp-net-core-authorization-part-1-of-2/ - conterio
在项目中哪里添加这个类? - Hamed_gibago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接