【发布时间】: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