【问题标题】:Custom Authentication Module inside MVC3 web appMVC3 Web 应用程序中的自定义身份验证模块
【发布时间】:2012-04-30 20:34:20
【问题描述】:

上下文:

我们有一个内部的 Asp.Net Web 应用程序,它被配置为使用 Windows 身份验证。作为此身份验证方面的一部分,我们有一个 HttpModule,它基本上抓取 HttpContext.Current.Identity.Name 并返回一个 UserInfo 对象,该对象被放入 HttpContext.Items 集合中。

在通过 MVC3 迁移它时,我有一个基本控制器和 OnActionExecuting,我根本无法在集合中看到这个 UserInfo 项。任何见解都会很棒。这是我的设置:

基础控制器:

protected override void OnActionExecuting(ActionExecutingContext ctx)
        {
            if (ctx.HttpContext.Items["UserInfo"] != null)
            {
                UserInfo currentUser = (UserInfo)ctx.HttpContext.Items["UserInfo"];
                dynamic viewBag = ctx.Controller.ViewBag;
                viewBag.CurrentUser = currentUser;
            }
            else
            {
                // Unauthorized do something
            }            

            base.OnActionExecuting(ctx);
        }

web.config:

<system.web>
    <httpModules>
      <add type="WFS.SIG.Client.Security.Authentication.WindowsAuthentication, WFS.SIG.Client.Security" name="AuthenticationModule"/>
    </httpModules>
</system.web>....

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="AuthenticationModule" type="WFS.SIG.Client.Security.Authentication.WindowsAuthentication, WFS.SIG.Client.Security" />
    </modules>
</system.webServer>

【问题讨论】:

  • 原来问题出在 HTTP 模块中。它只为 .aspx、.svc 和 .ascx 文件提供请求。对于 MVC,请求者是控制器,它没有提供服务。现在集合中的 UserInfo 项正在通过。

标签: asp.net-mvc authentication httpmodule


【解决方案1】:

我认为你的代码应该是这样的:

protected override void OnActionExecuting(ActionExecutingContext ctx) 
{ 
    if (ctx.HttpContext.Items["UserInfo"] != null) 
    { 
        UserInfo currentUser = (UserInfo)ctx.HttpContext.Items["UserInfo"]; 
        ViewBag.CurrentUser = currentUser; 
    } 
    else 
    { 
        // Unauthorized do something 
    }             
    base.OnActionExecuting(ctx); 
} 

对 HttpContext 的访问应该像这样工作。但是您可以直接访问 ViewBag。

您能否检查您的身份验证模块是否真的被调用并且是否在 HttpContext 中存储了一个对象?可以设置断点吗?

【讨论】:

  • 没有抛出异常。问题是永远不会满足“如果”条件,因此永远不会设置 viewbag 属性。似乎 HttpModule 永远不会被初始化。
  • 确实如此。尝试在 HttpModule 代码中设置断点。您使用什么类型的 IIS?如果是 IIS 7.x,是否处于集成模式?
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多