這是一個更新:定製AuthorizeAttribute只適用於開發環境
到asp.net開發我是新的,這是我第一次部署應用程序。它在開發環境中運行良好,在Visual Studio中進行調試。但是,當我部署,我得到的
401(未授權)
錯誤,當我登錄。
我使用的角前端這使得該發佈請求需要通過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
對象中的某個問題嗎?從生產環境中會發生這種情況的開發環境可以改變什麼?
謝謝。