2012-02-28 58 views
1

我有一個ASP.NET服務器設置作爲身份驗證類型的ASP.NET MVC站點。我還有一個帶有Users表和Roles表的獨立數據庫(用戶與一個或多個角色相關)。如果用戶名同時位於用戶表和CAS系統中,用戶只能登錄系統。我有這個解決方案的工作。自定義用戶和角色與ASP.NET MVC3

我的問題是我現在需要某種形式的User.IsAuthenticated觸發的,所以我可以跟蹤當前用戶(從我的數據庫),而不會是我試圖讓已註銷用戶的跟蹤的可能性。我一直在想的是我需要添加用戶到HttpContext,但我不知道如何觸發清除用戶,如果CAS會話超時或用戶註銷。

我也希望有一些功能,如User.IsInRole(再次使用我的數據庫,而不是ASP.NET),但不知道如何去實現這個。我想如果我可以成功地將用戶添加到HttpContext中,那麼IsInRole方法將僅僅是一個User.Roles.Contains(字符串角色)方法,但是如果我希望使用該方法,例如,如何使用帶有DataAnnotation [Authorize(role =「ExampleRole」)]]。

我看過這樣的問題How do I create a custom membership provider for ASP.NET MVC 2?但這並不爲我工作(可能使用CAS認證的我怎麼辦?)因爲我真的不

任何指導或閱讀的背景知識,將不勝感激確定我應該在哪裏開始。我已經閱讀了GenericPrinciple,原理和IIdentity,但我很努力地看到我可以如何將它們應用到我目前的項目中。

+0

你看過[nerddinner](http://nerddinner.codeplex.com/)嗎?他們實現CAS,並使用['FormsAuthenticationTicket'](http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.aspx)來存儲標準成員資格提供者之外的詳細信息。 – 2012-02-29 04:03:42

+0

@Brad感謝您的鏈接,有趣的是,自從我上次看到它以來,nerddinner有多大變化。不幸的是,我真的無法找到幫助我的代碼的方法,因爲一開始我的認證代碼是完全不同的(我使用Jasig-CAS不知道這是否有所作爲),還有,從我可以告訴,FormsAuthenticationTicket存儲的唯一數據是用戶名和失效時間(由於Jasig-CAS服務器不受我控制,我無法提供失效時間,我不確定到期時間是什麼,它可以也從其他網站更新),而我需要存儲一個類 – Manatherin 2012-02-29 07:13:22

回答

0

結束了一個自定義的授權屬性,它使用CAS登錄來檢查用戶是否存在於我的數據庫中。它還檢查該用戶的角色。我還使用一個靜態類來保存會話中的當前用戶,並使用註銷方法在用戶註銷時放棄會話。

-1

我對你有一種雙親。此鏈接在解釋如何用自己的對象替換HttpContext用戶方面做得很好:http://bradygaster.com/custom-authentication-with-mvc-3.0

他的方法使用MVC篩選器,但您也可以捕獲Global.asax文件中的Authentication事件。在你自己的實現中使用表單系統可能是微不足道的,取決於你正在做什麼,但歸結爲在你自己的邏輯中調用FormsAuthentication.SetAuthCookie和.SignOut。

public static void FormsLogin(this User user, bool persist) 
    { 
     FormsAuthentication.SetAuthCookie(user.DisplayName, persist); 
     user.AddHistory("Login event.", HistoryType.Login, "SYSTEM"); 
     Users.OnUserLogin(user); 
     SetLastActivity(user); 
    } 

    public static void FormsLogout(this User user) 
    { 
     FormsAuthentication.SignOut(); 
    } 

最後,一旦你有登錄的東西出來,你可以使用自己更復雜的權限系統,通過自定義的身份驗證屬性。我記得從一些其他的答案和文章中拼湊出來,但我目前似乎無法找到資料來源,如果我找到它們,我會嘗試使用信用來源進行編輯。現在,我所能提供的就是這個要點,它提供了我使用的屬性之一:https://gist.github.com/1959509

請記住,唯一真正相關的部分是覆蓋OnAuthorization,它可以完成實際的工作。