这是以下内容的更新:
我是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
对象中的某个问题吗?什么可以从开发环境中改变,这会在生产环境中发生这种情况?
感谢。
答案 0 :(得分:0)
我多次部署应用程序,我使用Visual Studio Web Deploy Package
完成了它。而且我真的做了好几次,只是为了测试我做得对。之后,我开始直接使用Web Deploy
发布。
IIS中的我的站点树就像
|-Sites
|----Default
|-------MyApplication
正如我所说,它没有用。我决定全部启动并删除网站,删除相关的应用程序池并使用Web Deploy
发布,但这次我的网站树就像
|-Sites
|----MyApplication
......现在它奏效了。原因是什么?