【问题标题】:What is Webform's "UrlAuthorizationModule.CheckUrlAccessForPrincipal" equivalent for MVC?Webform 的 MVC 的“UrlAuthorizationModule.CheckUrlAccessForPrincipal”等价物是什么?
【发布时间】:2012-07-21 21:15:45
【问题描述】:

我在为我的公司编写自定义 SSO 解决方案时遇到问题。为了简单起见,我制作了一个自定义身份验证 httpmodule,它拦截所有请求以检查用户身份验证状态。如果未通过身份验证,用户将被重定向到我的自定义 sso 登录页面。

问题是,当用户未通过身份验证时,我想检查他是否可以访问请求的页面/资源...使用 Webforms,没问题,我在 web.config 中添加了一个授权块,然后我使用UrlAuthorizationModule.CheckUrlAccessForPrincipal 使用匿名用户。一切正常...

但是当我将我的模块应用到 MVC (3) 网站时,这不再起作用(原因很明显,比如可以从不同的 url 访问相同的控制器和/或操作使用路由时,并且因为授权是通过控制器属性进行的)。

我怎样才能做到这一点?我一直在搜索一整天,没有找到任何相关信息:/

【问题讨论】:

标签: asp.net-mvc routing webforms authorization httpmodule


【解决方案1】:

我遇到了同样的问题。
在此处查看解决方案:MVC equivalent of Webforms "UrlAuthorizationModule.CheckUrlAccessForPrincipal"

您必须从另一个控制器读取信息。这 可以通过实例化其上下文和描述符来完成,然后 为该控制器实例化 AuthorizationContext 并读取 过滤器信息。

【讨论】:

    【解决方案2】:

    ASP.NET MVC 3 Internet 应用程序模板包括一个基本的 AccountController,它实现了以下操作(以及相关的模型和视图):

    • 登录
    • 注册
    • 更改密码/更改密码成功

    您只需要您希望保护的操作或类的 [Authorize] 属性。但如果你需要真正定制的东西,你可以像我做的那样做。

    我创建了一个自定义类来覆盖我的应用程序中的安全性。

    public class AuthorizeActivityAttribute : AuthorizeAttribute
        {
           protected override bool AuthorizeCore(HttpContextBase httpContext)
           {
            HttpContext currentContext = HttpContext.Current;
    
            //Do your custom authentication stuff here and return true or false depending on results
            Return true;
           }
        }
    

    现在在我的控制器中,我有以下内容:

    [AuthorizeActivity] 
            public ActionResult Index()
            {
                ViewBag.Message = "Welcome";
    
            return View();
            }
    

    【讨论】:

    • 感谢您的回答;)但不幸的是,这不是我要问的。我已经知道如何保护对控制器和操作的访问,但我需要的是:在控制器处理请求之前(当我在 httpmodule 中时)如何以编程方式知道当前请求是被允许还是被拒绝?
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2014-06-12
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多