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

时间:2017-06-19 16:40:29

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

这是以下内容的更新:

  

我是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;

它总是返回false。在这个块中

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

它会抛出System.NullReferenceException

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

那么,它会是什么?我将数据从开发数据库复制到生产数据库,因此错误无法从那里进行。它可能是HttpActionContext对象中的某个问题吗?什么可以从开发环境中改变,这会在生产环境中发生这种情况?

感谢。

1 个答案:

答案 0 :(得分:0)

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

|-Sites

|----Default

|-------MyApplication

正如我所说,它没有用。我决定全部启动并删除网站,删除相关的应用程序池并使用Web Deploy发布,但这次我的网站树就像

|-Sites

|----MyApplication

......现在它奏效了。原因是什么?