我從繼承System.Web.Http.AuthorizeAttribute創建自定義授權/認證例程以滿足使用ASP.NET開發的Web應用程序的一些不尋常要求MVC 4.這增加了用於Web客戶端Ajax調用的Web API的安全性。要求是:如何自定義ASP.NET Web API AuthorizeAttribute以獲取異常要求
- 用戶必須每次進行交易的時間來驗證 別人還沒有走到工作站後有人 登錄走開了登錄。
- 在編程時無法將角色分配給Web服務方法。 必須在運行時分配它們,以便管理員可以配置此項。這些信息存儲在系統數據庫中。
網頁客戶端是一個single page application (SPA)如此典型的窗體身份驗證不工作這麼好,但我想重用盡可能多的ASP.NET安全框架,因爲我能滿足要求。定製AuthorizeAttribute對於確定哪些角色與Web服務方法關聯需求2非常有用。我接受三個參數,應用程序名稱,資源名稱和操作以確定哪些角色與方法關聯。
public class DoThisController : ApiController
{
[Authorize(Application = "MyApp", Resource = "DoThis", Operation = "read")]
public string GetData()
{
return "We did this.";
}
}
我重寫OnAuthorization方法來獲得角色和驗證用戶。由於用戶必須針對每個事務進行身份驗證,因此我通過在同一步驟中執行身份驗證和授權來減少來回的喋喋不休。我通過使用基本身份驗證從Web客戶端獲取用戶憑據,該身份驗證將HTTP頭中的加密憑據傳遞給用戶。所以我OnAuthorization方法是這樣的:
public override void OnAuthorization(HttpActionContext actionContext)
{
string username;
string password;
if (GetUserNameAndPassword(actionContext, out username, out password))
{
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
base.Roles = GetResourceOperationRoles();
}
else
{
FormsAuthentication.SignOut();
base.Roles = "";
}
}
else
{
FormsAuthentication.SignOut();
base.Roles = "";
}
base.OnAuthorization(actionContext);
}
GetUserNameAndPassword檢索來自HTTP標頭的憑據。然後我使用Membership.ValidateUser驗證憑據。我有一個自定義成員資格提供程序和角色提供程序插入到一個自定義數據庫。如果用戶通過身份驗證,那麼我將檢索資源和操作的角色。從那裏我使用基地OnAuthorization完成授權過程。這是它破裂的地方。
如果用戶通過身份驗證,我使用標準表單身份驗證方法在(FormsAuthentication.SetAuthCookie)中記錄用戶,如果他們失敗,我將它們註銷(FormsAuthentication.SignOut)。但問題似乎是基地OnAuthorization類無權訪問本金已更新,以便IsAuthenticated設置爲正確的值。它總是落後一步。我的猜測是,它正在使用一些緩存的值,直到訪問Web客戶端時纔會更新。
因此,所有這一切導致了我的具體問題是,有另一種方式來設置IsAuthenticated爲正確的值當前主要不使用cookies嗎?在我看來,Cookie並不適用於我必須每次驗證身份的特定場景。我知道IsAuthenticated原因未設置爲正確的值我也覆蓋HandleUnauthorizedRequest方法是:
protected override void HandleUnauthorizedRequest(HttpActionContext filterContext)
{
if (((System.Web.HttpContext.Current.User).Identity).IsAuthenticated)
{
filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
這使得如果出現故障,我回去的禁止狀態代碼的Web客戶端是因爲授權而不是身份驗證,因此可以做出相應的響應。
那麼,什麼是設置IsAuthenticated在這種情況下當前原則的正確方法?
你可以請分享方法正文GetUserNameAndPassword(actionContext,出的用戶名,出密碼)? –
@VijayBalkawade - 此代碼現在是SimpleSecurity開源項目的一部分。您可以在這裏獲取GetUserNameAndPassword的完整源代碼。 https://simplesecurity.codeplex.com/SourceControl/latest#SimpleSecurity.Filters/BasicAuthorizeAttribute.cs –
由於Codeplex即將關閉,我已將[GetUserNameAndPassword'複製到Pastebin](https://pastebin.com/Yq86aNjL)。 –