asp.net-mvc - 如何根据区域将未经授权的用户重定向到登录页面?

标签 asp.net-mvc authentication redirect asp.net-mvc-areas

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

公共(public)端有可选的身份验证,某些 View 仅限于具有适当角色的经过身份验证的用户。如果用户在未经授权或没有适当角色的情况下尝试访问公共(public) Controller ,我希望他们被重定向到“公共(public)”登录页面。

只需一个简单的属性即可按需要工作:
[Authorize(Roles = "Organizer")]
但是,如果用户尝试访问管理区域中的任何内容,如果他们没有经过身份验证,或者经过身份验证但没有“管理员”角色,那么我希望他们被重定向到不同的登录屏幕。
( https://localhost:44300/Admin/Account/Login 而不是 https://localhost:44300/Account/Login )。

是否有一种简单的方法可以为整个区域应用备用登录重定向?

最佳答案

您可以创建自定义授权属性,所以在 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"];

关于asp.net-mvc - 如何根据区域将未经授权的用户重定向到登录页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768193/

相关文章:

c# - 从 Web Api 2 IAuthenticationFilter AuthenticateAsync 方法设置 cookie

html - 将 .htaccess 设置为不将文件到达目录

.htaccess - 更改站点域

c# - 使用 System.IO.Compression 创建后无效的 zip 文件

c# - 如何使用 itextsharp 获取 html 内容并将其转换为 PDF?

c# - 我该如何解决这个问题?单元类型存在于两个dll文件中

Bash - 将 stdout 重定向到日志和屏幕,仅使用 stderr 进行日志记录

javascript - document.getelementbyid 无法识别 Razor 元素

python - 无法反序列化解码 JWT python 的关键数据

node.js - BCrypt 错误非法参数 : string, 对象