如果声明不存在,我该如何重定向

时间:2016-02-04 11:52:09

标签: asp.net-identity asp.net-core asp.net-core-mvc asp.net-authorization

背景故事

在我的应用程序中,身份用户与许多组织相关联,每个协会的行为与个人帐户的行为类似。但在相同的登录下。在初次登录时,用户选择他们想要继续的帐户,在这样做时,我创建一个声明(擦除对该类型的任何现有声明)并设置他们选择的帐户的ID。

问题

目前我使用政策来检查我的控制器上是否填写了相应的ID声明,是否有任何方法可以将用户重定向到“帐户”选项'页面使用我的政策?如果没有,那将被视为Asp.net的方式。我应该对每个控制器映射方法执行检查吗?

进一步使事情复杂化

我的很多方法都是Ajax的返回类型JSONResult,因此我可以预见自己必须返回' direct到'我的JSON中的字段并在JavaScript中处理它是否适当,如果它存在于响应中,那么还有更好的方法吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

如果未设置特定角色/声明,请使用应用于控制器的过滤器:

public class CheckAuthorizationFilter : ActionFilterAttribute 
{
    private static readonly List<string> Exceptions = new List<string>
        {
            "account/",
            "public/"
        };

    /// <summary>
    /// Called by the ASP.NET MVC framework before the action method executes.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public override void OnActionExecuting([NotNull] ActionExecutingContext filterContext)
    {
        Contract.Requires(filterContext != null);
        Contract.Requires(filterContext.HttpContext != null);
        Contract.Requires(filterContext.HttpContext.User != null);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            string actionName =
                $"{filterContext.ActionDescriptor.ControllerDescriptor.ControllerName}/{filterContext.ActionDescriptor.ActionName}"
                    .ToLower();
            if (!Exceptions.Any(actionName.StartsWith))
            {
                UserProfile user = UserProfileCache.Instance.Get(new TimeJackContext(),
                    new object[] {filterContext.HttpContext.User.Identity.GetUserId()});
                if (user == null || user.UserState != UserState.Active)
                {
                    SessionMessage.AddMessage(
                        $"You ({filterContext.HttpContext.User.Identity.Name}) are not allowed to use this smart tool at this time.", SessionMessage.MessageType.warning);
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary
                        {
                            {"Controller", "Account"},
                            {"Action", "LogOff"}
                        });
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

并将过滤器添加到全局过滤器列表中:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    Contract.Requires(filters != null);
    filters.Add(new DatabaseUpgradeNeededFilter());
    filters.Add(new HandleErrorAttribute());
    filters.Add(new WarnAboutOldBrowsersAttribute());
    filters.Add(new CheckAuthorizationFilter()); // <---
    filters.Add(new RedirectToSslFilter());
    // ...
}

答案 1 :(得分:0)

如果您正在使用cookie auth middleware来保留您的委托人,那么您可以使用“禁止”设置选择在政策评估失败时重定向到的网页;

-----------------------------------------------------------------------------
| EVENT_ID | EVENT_WORKDAY | EVENT_PLACE | EVENT_TIME          | EVENT_TYPE |
-----------------------------------------------------------------------------
    1      |   1           |    null     | 2016-04-02 06:00:00 |    3
    2      |   1           |    1        | 2016-04-02 06:15:00 |    1
    3      |   1           |    1        | 2016-04-02 06:30:00 |    1
    4      |   1           |    1        | 2016-04-02 06:45:00 |    1
          ...             ...
   15      |   1           |    1        | 2016-04-02 09:45:00 |    1
   16      |   1           |    null     | 2016-04-02 09:53:00 |    2
   17      |   1           |    2        | 2016-04-02 10:22:00 |    1

然后在/ Account / Switch

中实现切换逻辑