我試圖在MVC3中做一件簡單的事情。使用Forms身份驗證的MVC3中的簡單授權
我有一個應用程序使用表單身份驗證來驗證用戶與第三方SSO。 SSO在成功登錄後發回到我的應用程序中的特定控制器操作。然後我打電話給FormsAuthentication.SetAuthCookie(user,false);
。
我試圖實現某種程度的授權。簡而言之,用戶可以以多種不同的角色存在,例如, Admin
和Developer
。某些控制器操作應僅適用於某些角色。通過調用另一個外部API來獲得用戶所屬角色的詳細信息,該API將返回一個簡單的JSON響應指示。
從理論上講,這應該是爲做這樣的事情簡單經過我設置FormsAuthentication餅乾:
string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
HttpContext.User = new GenericPrincipal(User.Identity, rolelist);
但是,我不能打電話SetAuthCookie
後直接調用此方法,因爲HttpContext.User
沒有什麼在這一點上有意義。
我可以嘗試在每個請求上設置此項,但對我的應用程序的請求將意味着來回API調用。
最有前途的方法到目前爲止,我所看到的是創建一個自定義的授權屬性,並覆蓋OnAuthorization
做這樣的事情:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (<some way of checking if roles have already been set for this user, or role cache has timed out>)
{
string[] rolelist = GetRoleListForUserFromAPI(filterContext.HttpContext.User.Identity.Name);
filterContext.HttpContext.User = new GenericPrincipal(filterContext.HttpContext.User.Identity,rolelist);
}
}
然後我可以用[MyCustomAuthorization(Roles="Admin")]
在控制器動作前,使魔術發生。
但是,我不知道如何檢測當前的HttpContext.User
對象是否設置了其角色,或者它是否設置了一定的時間以前,並且需要另一個API行程。
這是最好的方法是什麼?
很好的問題.... –