【问题标题】:Custom AuthorizeAttribute only works in development environment自定义 AuthorizeAttribute 仅适用于开发环境
【发布时间】:2017-06-19 16:40:28
【问题描述】:

这是对以下内容的更新:

我是 asp.net 开发的新手,这是我第一次部署应用程序。它在开发环境中运行良好,在 Visual Studio 中调试。但是当我部署时,我得到了

401(未经授权)

登录时出错。

我正在使用一个 Angular 前端,这使得这个发布请求需要通过 OAuth 的令牌。我收到此令牌,然后尝试获取当前授权用户。用户控制器使用继承 AuthorizeAttribute 属性的自定义授权属性。这是我收到此错误的时候,但仅在生产环境中。在开发环境中,使用visual studio、iis express和localdb一切正常。

所以这是我的问题:可能是什么原因造成的?在 IIS 或 Visual Studio 部署中是否缺少一些配置?我必须在代码中的某处进行更改以使其在生产环境中工作吗?

我对代码做了更多研究,事情是这样的:自定义 AuthorizeAttribute 在开发环境中就像一个魅力,但在生产环境中却没有。

到目前为止我发现的是:base.IsAuthorized(actionContext) 总是返回 false,即使令牌发送正确也是如此。我正在使用 chrome ARC 插件发送请求。此外,ClaimsIdentity 似乎找不到 'UserId' 声明。这里有一点编码:

    protected override bool IsAuthorized(HttpActionContext actionContext) {

        if (!base.IsAuthorized(actionContext))
           return false;
        
        ClaimsPrincipal principal = GetRequestClaimsPrincipal(actionContext.ControllerContext.Controller);

        var currentAccountPermission = GetAccountPermission(principal.Identity);

        return HasPermission(currentAccountPermission);
    }



    private ClaimsPrincipal GetRequestClaimsPrincipal(IHttpController controller) {
        return ((ApiController)controller).Request.GetRequestContext().Principal as ClaimsPrincipal;
    }

    private IEnumerable<UserPermission> GetAccountPermission(IIdentity identity)
    {
        var claimsIdentity = new ClaimsIdentity(identity);
        var id = Convert.ToInt32(claimsIdentity.FindFirst("UserId").Value);
       
        var accountPermissions = _userPermissionService.GetPermissionByUserId(id);

        return accountPermissions;
    }

在这个区块

if (!base.IsAuthorized(actionContext))
    return false;

它总是返回假。而在这个区块中

var id = Convert.ToInt32(claimsIdentity.FindFirst("UserId").Value);

它会抛出一个System.NullReferenceException

提醒这些问题仅发生在生产环境中。

那么,它可能是什么?我将数据从开发数据库复制到生产数据库,所以错误不能来自那里。 HttpActionContext 对象中可能有问题吗?开发环境会发生什么变化,从而在生产环境中实现这一点?

谢谢。

【问题讨论】:

    标签: c# asp.net visual-studio-2015 oauth webdeploy


    【解决方案1】:

    我多次部署应用程序时,都是使用 Visual Studio Web Deploy Package 完成的。我真的做了好几次,只是为了测试我是否做得对。之后,我开始直接使用Web Deploy 发布。 我在 IIS 中的站点树就像

    |-Sites
    
    |----Default
    
    |-------MyApplication
    

    正如我所说,它不起作用。我决定重新开始并删除站点,删除相关的应用程序池并使用Web Deploy 发布,但这次我的站点树就像

    |-Sites
    
    |----MyApplication
    

    ...现在它起作用了。原因?

    【讨论】:

    • 我在 Docker 中运行 ASP.NET Web 应用程序时遇到了类似的问题。标准 Dockerfile 将 Web 应用程序发布到 IIS 中的“默认网站”。 Web 应用程序没有获得正确的 ClaimsPrincipal,它是一个空的 WindowsPrincipal。一旦我更改了 Dockerfile 以从 IIS 中删除“默认网站”并部署到新网站,这些声明就奏效了。我不知道为什么!
    猜你喜欢
    • 2021-08-08
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2017-09-30
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多