繁体   English   中英

如何在 .ASP.NET Core MVC 中使用多个登录页面和未经授权的用户重定向不同的登录页面

[英]How to use multiple login pages in .ASP.NET Core MVC and unauthorized user redirect different login page

我的应用程序中有两个登录页面。

  • 一个是管理员登录页面
  • 其次是公共登录页面。

两者都是不同表管理的数据库表。

我正在使用声明类型登录。

var user =new AdminUserViewModel();

// create claims for user's username
var claims = new List<Claim>();


if (!string.IsNullOrEmpty(user.UserName))
{
    claims.Add(new Claim(ClaimTypes.Name, user.UserName, ClaimValueTypes.String, "Admin"));
    claims.Add(new Claim("UserId", user.AdminUserId.ToString(), ClaimValueTypes.Integer64, "Admin"));
    claims.Add(new Claim("AdminUserPermissionMapping", JsonConvert.SerializeObject(user.AdminUserPermissions), ClaimValueTypes.String, "Admin"));
}

// create principal for the current authentication scheme
var userIdentity = new ClaimsIdentity(claims, "Authentication");
var userPrincipal = new ClaimsPrincipal(userIdentity);

// set value indicating whether session is persisted and the time at which the authentication was issued
var authenticationProperties = new AuthenticationProperties
{
    IsPersistent = isPersistent,
    IssuedUtc = DateTime.Now
};

// sign in
// await httpContextAccessor.HttpContext.SignInAsync(WebAuthenticationDefaults.AuthenticationScheme, userPrincipal, authenticationProperties);
 await httpContextAccessor.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, authenticationProperties);

创建自定义 AuthorizeAttribute。

[AttributeUsage(AttributeTargets.Class)]
public sealed class ILGAuthorizeAttribute : Attribute, IAuthorizationFilter
{
    private readonly ILGAuthorizeScheme _AuthenticationScheme;
    public ILGAuthorizeAttribute(ILGAuthorizeScheme AuthenticationScheme)
    {
        _AuthenticationScheme = AuthenticationScheme;
    }
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        var controllerActionDescriptor = filterContext.ActionDescriptor as ControllerActionDescriptor;
        if (controllerActionDescriptor != null)
        {
            var actionAttributes = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true);
            if (actionAttributes.Any(x => x is AllowAnonymousAttribute))
                return;
        }            

        if (filterContext != null)
        {
            string url = filterContext.HttpContext.Request.Path;
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                if (url.ToLower().StartsWith("/admin") && _AuthenticationScheme.ToString().ToLower() == "admin")
                {
                    var authenticateAdminResult = filterContext.HttpContext.User.Claims.FirstOrDefault(claim => claim.Type == "UserId" && claim.Issuer.Equals("Admin", StringComparison.InvariantCultureIgnoreCase));
                    if (authenticateAdminResult == null)
                        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "", controller = "Home", action = "Index" }));
                }
                else
                {
                    var authenticateSubscriberResult = filterContext.HttpContext.User.Claims.FirstOrDefault(claim => claim.Type == "SubscriberId" && claim.Issuer.Equals("Subscriber", StringComparison.InvariantCultureIgnoreCase));
                    if (authenticateSubscriberResult == null)
                        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "Admin", controller = "Home", action = "Index" }));
                }
            }
            else
            {
                if (url.ToLower().StartsWith("/admin"))
                    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "Admin", controller = "Account", action = "Login" }));
                else
                    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "", controller = "Account", action = "CreateUsernamePassword" }));
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM