【问题标题】:ASP.Net MVC - Conditional Unauthorized RedirectsASP.Net MVC - 有条件的未经授权的重定向
【发布时间】:2012-01-23 23:28:40
【问题描述】:

我的 MVC3 应用为用户提供了三种登录方式

  1. 电子邮件 + 别名
  2. OpenID 提供者
  3. 用户名+密码

前两个适用于没有帐户的访问者,允许他们对事物发表评论/投票;最后一个适用于拥有具有提升权限的数据库用户帐户的作者和管理员。因此,有两种登录表单 - 一种用于访问者,一种用于完全用户。

未经身份验证/未经授权的资源访问尝试作为标准重定向到登录页面。

问题:

  1. 如何有条件地将这些请求重定向到适当的位置?需要对完整用户登录表单具有作者/管理员权限的资源,以及仅需要对访问者登录表单具有访问权限的资源?

  2. 另外,在 AJAX 或部分视图调用的情况下,我是否可以避免重定向?例如,我想将 cmets 部分视图嵌入到我的条目视图中,如果它们未经身份验证,则不重定向,而只是将访问者登录嵌入其中。

更新:我不想维护 2 个 Atuhorize 属性。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 redirect unauthorized


    【解决方案1】:

    1- 您可以从 [AuthorizeAttribute] 继承并自定义实现以路由到所需的未授权页面。

    看到选中的遮阳篷是这个问题: Redirecting unauthorized controller in ASP.NET MVC

    2- 如果您从 ajax 调用(即 $.Get(url)$("#somediv").Load(url))加载部分内容,请确保使用您的自定义 [AuthorizeAttribute] 正确修饰 url 调用的操作。

    否则,您将需要在 Razor 视图中添加一些逻辑来检查用户是否已通过身份验证。类似于

      @if (User.Identity.IsAuthenticated)
      {
          // Normal case
      }
      else
      {
          @Html.Partial("Login")
      }
    

    您的登录部分将显示所需的登录视图。

    更新

    您可以实现 2 个不同的属性,每个场景一个。

    [AttributeUsage( AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false )]
    public class IsUserAdminAttribute : CustomAuthorizedBaseAttribute
    {
        // Custom logic to redirect to admin logon partial/view
        ...
    }
    
    [AttributeUsage( AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false )]
    public class IsAuthenticatedAttribute : CustomAuthorizedBaseAttribute
    {
        // Custom logic to redirect to basic/comment logon partial/view
        ...
    }
    
    [AttributeUsage( AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false )]
    public abstract class CustomAuthorizedBaseAttribute : AuthorizeAttirbute
    {
        // Shared custom logic implementation
        ...
    }
    

    您可以根据场景使用其中一种来装饰您的控制器操作。

    【讨论】:

    • 感谢您的回复。它很接近,但不是我想要的。我有一个自定义授权过滤器/属性,并且正在考虑 OnAuthorization() 方法,但我试图让事情尽可能干燥,所以我试图避免让我的属性知道视图。至于 AJAX 逻辑,即使我按照您的建议包裹在 Razor 中,如果我的属性导致重定向,也会导致同样的问题,不是吗?最后,似乎我必须知道所需的角色才能知道他们需要发送到哪个登录表单。
    • "至于 AJAX 逻辑,即使我按照您的建议包裹在 Razor 中,如果我的属性导致重定向,也会导致同样的问题,不是吗?"是的,它要么是 [AuthorizeAttribute] 装饰(如果您实际上调用控制器操作来呈现您的部分)或一些 @if(User.Identity.IsAuthenticated) {...} 包装(如果您在不调用任何控制器操作的情况下渲染部分)。
    • "我有一个自定义的授权过滤器/属性,并且正在考虑 OnAuthorization() 方法,但我试图让事情尽可能干燥,所以我试图避免让我的属性知道的意见。”你不能使用继承自[AuthorizeAttribute] 的两个不同的类吗?或者,更好的是,在您的 2 个自定义 [AuthorizeAttribute] 之间添加一个继承层来保存常见的东西。
    猜你喜欢
    • 2020-04-25
    • 2010-11-01
    • 2011-12-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多