自定义 AuthorizeAttribute 仅适用于开发环境

Custom AuthorizeAttribute only works in development environment

这是更新:

I'm new to asp.net development and this is the first time I deploy an application. It works well at the development environment, debugged in visual studio. But when I deploy, I get the

401 (Unauthorized)

登录时出错。

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

所以这是我的问题:它的原因可能是什么? IIS 或 visual studio 部署中是否缺少某些配置?是否需要更改代码中的某处才能使其在生产环境中运行?

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

到目前为止我发现的是:base.IsAuthorized(actionContext) 总是 returns 错误,即使正确发送了令牌也是如此。我正在使用 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;

它总是 returns 错误。而在这个街区

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

它抛出一个 System.NullReferenceException

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

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

谢谢。

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

|-Sites

|----Default

|-------MyApplication

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

|-Sites

|----MyApplication

...现在成功了。原因?