C# 自定义属性仅在开发环境中有效

C# 自定义属性仅在开发环境中有效,c#,asp.net,visual-studio-2015,oauth,webdeploy,C#,Asp.net,Visual Studio 2015,Oauth,Webdeploy,这是以下内容的更新: 我是asp.net开发新手,这是我第一次部署应用程序。它在开发环境中运行良好,在VisualStudio中调试。但当我部署时,我得到了 401(未经授权) 登录时出错 我使用的是一个有角度的前端,这使得这个post请求需要一个通过OAuth的令牌。我收到此令牌,然后尝试获取当前授权用户。用户控制器使用自定义授权属性,该属性继承AuthorizeAttribute属性。这是当我得到这个错误,但只有在生产环境。在开发环境中,使用VisualStudio、iis express和

这是以下内容的更新:

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

401(未经授权)

登录时出错

我使用的是一个有角度的前端,这使得这个post请求需要一个通过OAuth的令牌。我收到此令牌,然后尝试获取当前授权用户。用户控制器使用自定义授权属性,该属性继承AuthorizeAttribute属性。这是当我得到这个错误,但只有在生产环境。在开发环境中,使用VisualStudio、iis express和localdb,一切都可以正常工作

所以我的问题是:它的原因是什么?IIS或visual studio部署中是否缺少某些配置?为了使代码在生产环境中工作,我是否必须在代码中的某些地方进行更改

我对代码做了更多的研究,这里有一件事:定制
AuthorizeAttribute
在开发环境中很有魅力,但在生产环境中却没有

到目前为止,我发现:
base.IsAuthorized(actionContext)
总是返回false,即使令牌发送正确。我用chrome ARC插件发送请求。此外,
索赔实体
似乎找不到
的“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;
    }
它总是返回false。在这个街区

if (!base.IsAuthorized(actionContext))
    return false;
var id = Convert.ToInt32(claimsIdentity.FindFirst("UserId").Value);
它抛出一个
System.NullReferenceException

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

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


谢谢。

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

|-Sites

|----Default

|-------MyApplication
正如我所说的,它不起作用。我决定从头开始,删除网站,删除相关的应用程序池,并利用
webdeploy
发布,但这次我的网站树是这样的

|-Sites

|----MyApplication

…现在它成功了。原因?

在Docker中运行ASP.NET web应用程序时,我遇到了类似的问题。标准Dockerfile将web应用程序发布到IIS中的“默认网站”。web应用程序未获取正确的ClaimsPrincipal,它是一个空的WindowsPrincipal。一旦我更改Dockerfile以从IIS中删除“默认网站”并部署到新网站,声明就起了作用。我不知道为什么!