2012-04-18 67 views
1

按照本指南中的步驟Using Azure ACS我配置了一個可用的Azure ACS服務&通過Facebook進行身份驗證,重定向回到運行在我的開發服務器上的網站。Azure ACS,WIF 3.5,Asp.Net 3.5自定義會員供應商和IsAuthenticated

驗證成功Azure ACS重定向回我的本地開發網站並且IsAuthenticated標誌爲true,但是我想將IsAuthenticated標誌設置爲true,只有當來自聲明的電子郵件也存在於本地數據庫中時,才能通過檢查/調用一個自定義的MembershipProvider。如果來自聲明的電子郵件不存在,我想將客戶端重定向到註冊頁面。一旦註冊和認證,我想將IsAuthenticated標誌設置爲true。

目前,使用Facebook和AzureACS進行身份驗證後,用戶可以請求安全頁面,例如ViewAccountBalance.aspx,即使該帳戶因爲開箱即用的IsAuthenticated標誌爲true而不存在。有興趣聽聽別人做了什麼,最好的做法是什麼。

回答

0

您需要明確區分認證和授權。由於用戶通過Facebook登錄,這意味着他已通過身份驗證(您知道他是誰以及他來自哪裏)。

現在,如果您想根據特定條件限制應用程序的某些部分,那麼您實際上正在談論授權。您可能會考慮將角色與簡單的HttpModule組合起來。例如:你的HttpModule可以驗證用戶正在瀏覽哪個頁面。如果用戶訪問需要一個有效的個人資料頁面,你可以使用下面的代碼:

public class RequiresProfileHttpModule : IHttpModule 
{ 
    public void Dispose() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.AuthorizeRequest += new EventHandler(OnAuthorize); 
    } 

    private void OnAuthorize(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
     if (app.Request.Url.ToString().Contains("bla") && !app.Context.User.IsInRole("UsersWithProfile")) 
      app.Response.Redirect("http://myapp/register.aspx"); 
    } 
} 

你需要的是更新的主要,以確保它有作用UsersWithProfile照顧的唯一的事如果用戶填寫了他的電子郵件地址。

這只是許多可能的解決方案之一。如果您使用ASP.NET MVC,則可以使用全局ActionFilters實現相同的結果。或者,您也可以嘗試使用IClaimsPrincipal(如果用戶具有配置文件,請添加聲明)。

+0

在Global.asax的OnInit()中增加了: this.PostAcquireRequestState + =(s,e)=> SecurityHelper.PostAcquireRequestState(); 然後,在SecurityHelper.PostAcquireRequestState中,我有邏輯來檢查頁面是否由標準FormsAuth保護,類似於(http://stackoverflow.com/questions/3390719/determine-if-current-page-requires-authorization) 我也通過Membership.GetUser進行查找,並檢查帳戶是否存在,否則我重定向到註冊頁面。 – Andre 2012-04-19 08:19:40

0

桑德里諾是正確的。您可以使用基於角色的授權(或更普遍的說,基於權利的授權)。默認情況下,ACS只是將身份提供商發佈的聲明返回給您的依賴方。對於Facebook,它將返回一封電子郵件聲明。但是,您可以配置ACS以創建其他規則。例如,您可以將特定用戶映射到值爲管理員的角色。那麼ACS也會將這個角色聲明返回給您的依賴方。然後你可以使用Sandrino的建議來使用基於角色的授權。您也可以參考http://msdn.microsoft.com/en-us/library/windowsazure/gg185915.aspx瞭解更多信息。