簡體   English   中英

ASP.NET MVC / Web API自定義身份驗證

[英]ASP.NET MVC / Web API Custom Authentication

我有ASP.NET MVC 4 / Web API混合應用程序。 身份驗證由現有應用程序處理。 在考慮保護這些類型的應用程序時,大多數文章都指向使用表單身份驗證以及要保護的MVC和API控制器/操作的[Authorize]屬性。 我想使用[Authorize]屬性,因為它將處理MVC路由和API路由,但不知道如何在沒有實際表單和使用內置成員資格提供程序的情況下執行此操作。

我應該采用這里描述的簡單方法嗎? 或者我應該創建一個處理邏輯的自定義成員資格提供程序?

為清楚起見,工作流程如下:

  1. 用戶通過現有的身份驗證門戶登錄。
  2. 如果經過身份驗證,它們會被重定向到我的應用程序以及一些其他數據,例如用戶名和電子郵件(因此不需要傳輸密碼)
  3. 我的應用程序設置了一個允許用戶繼續使用該應用程序的身份驗證cookie。

任何幫助將不勝感激。

  • 選項1

如果您現有的登錄門戶使用表單身份驗證,則可以在應用程序之間共享加密密鑰,以便他們可以讀取在登錄門戶中創建的身份驗證cookie:

如何在Web表單和MVC2應用程序之間共享基於.net(C#)的身份驗證會話?

  • 選項2

如果您未在登錄門戶中使用表單身份驗證,則可以保留現有進程,但添加手動創建身份驗證cookie的步驟。 這方面有很多變化,但這個問題在問題中表現出更高層次的方式,在答案中表現出更低層次的方法:

如何手動創建身份驗證cookie而不是默認方法?

這還要求應用程序之間的加密配置相同。

  • 選項3

否則,您要么使用SSO協議進行切換。 您可以保留登錄門戶的現有身份驗證過程,但需要添加其他代碼以協調SSO切換到其他應用程序。 SSO的出現是因為除了上面#1和2中使用的加密cookie方法之外,還沒有其他安全選項可用於執行瀏覽器重定向和通信身份驗證。

創建自己的基於cookie的方法是有風險的,可能會打開您無法預見的安全漏洞。

  • “我應該采用這里描述的簡單方法嗎?”

這個例子的重要之處在於,不清楚用戶名來自SetAuthCookie(username, ... 。這個問題暗示用戶將登錄到其他應用程序,該應用程序將查詢Web服務以確定該登錄是否是在這種情況下,它不是使用專用登錄門戶進行單點登錄,而是每個應用程序收集登錄信息並詢問Web API是否有效。在您的情況下,您不希望收集每個門戶中的登錄信息,但是檢測到他們已經登錄到deicated登錄門戶。

所以問題是登錄protal如何以安全的方式告訴你當你調用SetAuthCookie(username, ...username是什么SetAuthCookie(username, ...這正是SSO的用途。使用SSO切換,一個站點可以告訴另一個站點是安全的時尚,“我正在向你發送Bob123,你可以肯定它真的是Bob123而不是其他人。

選項#1和#2通過讓登錄門戶設置cookie來解決這個問題,並通過在應用程序之間共享密鑰,其他應用程序可以安全地讀取該cookie。

請注意,您不能只使用任何cookie來執行此操作。 表單身份驗證cookie以某種方式構建,以防止偽造cookie和其他篡改。

如果您跨越域,SSO將成為您唯一的選擇,因為在一個域中編寫的cookie無法在另一個域中讀取(瀏覽器僅為當前域提交cookie)。

有多個子域共享根域的表單身份驗證的解決方法:

正確創建跨域表單身份驗證cookie

有各種黑客用於重定向到具有加密信息的另一個站點,並讓該站點編寫表單身份驗證cookie,但其中大多數只是與SSO一樣復雜的可怕黑客。

您似乎嘗試重新發明單點登錄協議。 相反,您應該了解現有的SSO協議,如OAuth2或WS-Federation。

通常,SSO協議與您期望“工作流程”的行為類似。 確切的流程可能不同,但始終是身份提供程序對用戶進行身份驗證/驗證,並且IdP以某種方式將此信息傳遞給使用它的應用程序(例如,應用程序發出自定義cookie以建立用戶身份驗證)。

Authorize屬性不適用於Forms身份驗證。 設置請求生存期的主體的任何身份驗證模塊都可以替換Forms。 例如,會話認證模塊現在經常被使用,因為它修復了Forms模塊的一些特定問題(例如,無法持久存在長用戶數據)。

如果你需要一本關於SSO的好書,請看看這里:

http://msdn.microsoft.com/en-us/library/ff423674.aspx

你可以使用Owin來處理這個問題。 這是我用於使用Facebook進行身份驗證的代碼段,它還使用cookie:

using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

namespace ASPNetMVC53rdPartyAuth
{
    public partial class Startup
    {

      public void ConfigureAuth(IAppBuilder app)
      {
        // Enable the application to use a cookie to store information for the signed    
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        // Use a cookie to temporarily store information about a user logging in with a              
        // third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // third party login providers: 


        // You have to register this app at https://developers.facebook.com/ and get the     
        //appId and appSecret.   
        // Facebook requires SSL, so that need to be enanbled.  Project url can be found  
        // under project properties and can be localhost.
         app.UseFacebookAuthentication(
           appId: "xxxxxxxxxxxxxxxx",
           appSecret: "xxxxxxxxxxxxxxxx");
         );           
      }
    }
}

暫無
暫無

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

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