2012-12-18 62 views
2

我想創建一個ASP.NET MVC網站,該網站具有受Windows Azure ACS保護的特定區域。我希望默認區域不受保護(即允許匿名用戶),但只保護子區域。ACS會話啓動後

我已經通過從我的Web.config中的system.web部分刪除授權元素來實現此目的。

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

然後爲所需的MVC3區域添加受保護位置。

<location path="MyArea"> 
    <system.web> 
     <authorization> 
      <deny users="?" /> 
     </authorization> 
    </system.web> 
</location> 

然而,我的舊代碼,用於訪問IClaimsIdentity和拉斷的屬性它曾經住在我的Global.asax的在session_start事件處理。既然該站點不需要身份驗證來訪問默認區域,那麼Session_Start就會發生,而無需進行身份驗證。

我可以連接哪些事件來處理WIF的身份驗證事件?

我已經實現了使用SessionAuthenticationModule_SessionSecurityTokenReceived的滑動會話超時,並嘗試在OnPostAuthenticationRequest事件上添加我的用戶分析邏輯無濟於事。

我能得到第一佈線後的用戶最多,以下事件:

FederatedAuthentication.ServiceConfigurationCreated 

那麼這個事件中我連線到這個事件:

FederatedAuthentication.WSFederationAuthenticationModule.SignedIn 

然而,這一事件中會話爲空,session_start從不再被調用。因此,當重定向到身份提供商時,會話似乎已經崩潰。

匿名 - >的Application_Start
匿名 - >在session_start
匿名 - >導航到/ MyArea
匿名 - >重定向到ACS - >重定向到IDP
匿名 - >重定向到 - >在
AUTH登錄/ MyArea
auth - > FederatedAuthentication.WSFederationAuthenticationModule.SignedIn發生,但會話爲空!

更新:我還沒有找到一個地方存在會話和身份驗證。我正在使用Unity來按需檢測用戶。如果有事件發生,我會喜歡它,但我的工作仍然有效。

回答

3

你有幾種選擇取決於何時以及如何要執行你的邏輯(登錄後,當創建會話令牌時,接收它之後)。 SessionAuthenticationModule_SessionSecurityTokenReceived事件應該正常工作,但訂閱它可能會非常棘手。這是你如何做到這一點:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     ... 

     FederatedAuthentication.FederationConfigurationCreated += (s, e) => 
     { 
      FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenCreated += SessionAuthenticationModule_SessionSecurityTokenCreated; 
      FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenReceived += SessionAuthenticationModule_SessionSecurityTokenReceived; 
      FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += WSFederationAuthenticationModule_SessionSecurityTokenCreated; 
      FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += WSFederationAuthenticationModule_SecurityTokenValidated; 
      FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenReceived += WSFederationAuthenticationModule_SecurityTokenReceived; 
      FederatedAuthentication.WSFederationAuthenticationModule.SignedIn += WSFederationAuthenticationModule_SignedIn; 
     }; 
    } 

    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
    { 
     Debugger.Break(); 
    } 

    void SessionAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e) 
    { 
     Debugger.Break();    
    } 

    void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e) 
    { 
     Debugger.Break();    
    } 

    void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e) 
    { 
     Debugger.Break();    
    } 

    void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e) 
    { 
     Debugger.Break();    
    } 

    void WSFederationAuthenticationModule_SignedIn(object sender, EventArgs e) 
    { 
     Debugger.Break();  
    } 
} 

所有這些代碼在Global.asax文件中去,並要建立FederationConfigurationCreated事件加薪事件發生後(這是當SessionAuthenticationModule和WSFederationAuthenticationModule會可用)。我在每個事件處理程序中都添加了一個Debugger.Break。將它們留在那裏並調試應用程序以查看每個事件何時被觸發。這將允許您決定何時何地添加邏輯。

+0

它看起來不像我在我的FederatedAuthentication類上有那個事件。這隻適用於.NET 4.5嗎? – markti

0

使用[授權]屬性上要確保控制器/動作:

[Authorize] 
public ActionResult Index() 
{ 
    return View(); 
}