簡體   English   中英

自定義AuthorizeAttribute僅在開發環境中有效

[英]Custom AuthorizeAttribute only works in development environment

這是對以下內容的更新:

我是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對象中可能有問題嗎? 開發環境可能發生什么變化,從而使生產環境發生這種變化?

謝謝。

我多次部署應用程序時,都是使用Visual Studio Web Deploy Package 我確實做了幾次,只是為了測試我是否做對了。 之后,我開始直接使用Web Deploy 我在IIS中的網站樹就像

|-Sites

|----Default

|-------MyApplication

正如我所說,它沒有用。 我決定從頭開始,刪除站點,刪除相關的應用程序池,然后使用Web Deploy ,但是這次我的站點樹就像

|-Sites

|----MyApplication

...現在它起作用了。 原因是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM