Asp.net

ASP.NET OWIN WebForms 需要授權所有頁面

  • September 19, 2020

我使用 Visual Studio 2013 Update 2 創建了一個新的 ASP.NET WebForms 應用程序。然後我更新了所有 NuGet 包並刪除了所有 OAuth 內容,因為我只需要我熟悉的“表單”身份驗證。

我想要的是配置 OWIN/ASP.NET 身份框架**,以便所有頁面都需要授權**,包括預設頁面 - 所以使用者應該看到的第一頁是登錄頁面。這樣做的正確方法是什麼?我在 Internet 上找不到任何資源來展示如何使用 OWIN/ASP.NET 標識保護 WebForms 頁面。

我將以下 XML 添加到主 web.config 文件的底部,但出現錯誤:

<authorization>
 <deny users="?"/>
</authorization>

錯誤是:無法訪問請求的頁面,因為該頁面的相關配置數據無效。

您是對的,沒有關於將經典 ASP.Net 授權與 OWIN 安全中間件一起使用的資源。

我正在使用 ASP.Net 網頁,所以我的實驗與您的類似(我們都嘗試保護 aspx 或 cshtml 的靜態文件)。

我的實驗太可怕了。我正要用頭撞牆。

最後我發現瞭如何讓它執行。這就是我所做的:

  1. Web.config:保護除匿名使用者必須可用的特殊頁面之外的所有內容。
<configuration>
   <system.web>
       <authorization>
           <deny users="?" />
       </authorization>
   </system.web>

   <location path="shell.cshtml">
       <system.web>
           <authorization>
               <allow users="*" />
           </authorization>
       </system.web>
   </location>

   <location path="notFound.cshtml">
       <system.web>
           <authorization>
               <allow users="*" />
           </authorization>
       </system.web>
   </location>

   <location path="security/login.cshtml">
       <system.web>
           <authorization>
               <allow users="*" />
           </authorization>
       </system.web>
   </location>
</configuration>
  1. OWIN啟動類:
   public static class Startup
   {
       public static void Configuration(IAppBuilder app)
       {
           var cookieExpiration = TimeSpan.FromMinutes(20);

           app.UseCookieAuthentication(new CookieAuthenticationOptions
           {
               AuthenticationMode = AuthenticationMode.Active,
               CookieName = "efa",
               ExpireTimeSpan = cookieExpiration,
               SlidingExpiration = true,
               AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
               Provider = new CookieAuthenticationProvider
               {
                   OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager, User, long>(
                       validateInterval: cookieExpiration,
                       regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                       getUserIdCallback: identity => Identity.Identity.ExtractIdFromClaims(identity))
               }
           });

           app.UseWebApi(new HttpConfig());
       }
   }

設置是至關重要的AuthenticationMode = AuthenticationMode.Active。我花了一整天的時間來發現這一點。如果將其設置為Passive,身份驗證中間件將不會填充 HTTP 上下文的 Identity 和 Principal 對象,並且授權模組將禁止所有請求。

這將使經典UrlAuthorization模組根據 OWIN 中間件填充的身份為您工作。需要注意的是,Microsoft.Owin.Host.SystemWeb必須安裝 Nuget 包,否則 OWIN 將無法與 ASP.Net 管道集成。

您也可以使用這些現代 OWIN 授權模組 http://leastprivilege.com/2014/06/24/resourceaction-based-authorization-for-owin-and-mvc-and-web-api/ 它們是高度可定制的並且可以保護 MVC 控制器、Web API 控制器和靜態文件。

引用自:https://stackoverflow.com/questions/24614801