ASP0026:[AllowAnonymous]
從「更遠」覆寫 [Authorize]
值 | |
---|---|
規則識別碼 | ASP0026 |
類別 | 使用方式 |
修正程式是中斷或非中斷 | 不中斷 |
原因
與 [AllowAnonymous]
屬性相比,將 [Authorize]
屬性放置在「更接近」MVC 動作的位置會覆寫 [AllowAnonymous]
屬性並強制授權,這似乎是直觀的。 不過,不一定是這種情況。 重要的是屬性的相對順序。
下列程式碼顯示更接近 [Authorize]
屬性的範例,會由離得更遠的 [AllowAnonymous]
屬性覆寫。
[AllowAnonymous]
public class MyController
{
[Authorize] // Overridden by the [AllowAnonymous] attribute on the class
public IActionResult Private() => null;
}
[AllowAnonymous]
public class MyControllerAnon : ControllerBase
{
}
[Authorize] // Overridden by the [AllowAnonymous] attribute on MyControllerAnon
public class MyControllerInherited : MyControllerAnon
{
}
public class MyControllerInherited2 : MyControllerAnon
{
[Authorize] // Overridden by the [AllowAnonymous] attribute on MyControllerAnon
public IActionResult Private() => null;
}
[AllowAnonymous]
[Authorize] // Overridden by the preceding [AllowAnonymous]
public class MyControllerMultiple : ControllerBase
{
}
檔案描述
警告:[AllowAnonymous]
屬性從「更遠」覆寫 [Authorize]
屬性。
如何修正違規
如果您看到此警告,則所要採取的正確動作取決於屬性背後的意圖。 如果不小心將端點公開給匿名使用者,則應該移除更遠的 [AllowAnonymous]
屬性。 如果 [AllowAnonymous]
屬性是要覆寫更接近的 [Authorize]
屬性,您可以在 [Authorize]
屬性之後重複 [AllowAnonymous]
屬性,以釐清意圖。
[AllowAnonymous]
public class MyController
{
// This produces no warning because the second, "closer" [AllowAnonymous]
// clarifies that [Authorize] is intentionally overridden.
// Specifying AuthenticationSchemes can still be useful
// for endpoints that allow but don't require authenticated users.
[Authorize(AuthenticationSchemes = "Cookies")]
[AllowAnonymous]
public IActionResult Privacy() => null;
}
隱藏警告的時機
此診斷的嚴重性層級為「資訊」。 如果您想要覆寫 [Authorize]
屬性,則可以隱藏警告。 不過,建議您在 [Authorize]
屬性後面重複 [AllowAnonymous]
屬性,讓意圖更為清楚。