自定义 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
...现在成功了。原因?
这是更新:
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
...现在成功了。原因?