3

客戶端應用程序正在將「塊」中的音頻文件上傳到MVC3站點。客戶使用HttpWebRequestPOST來做到這一點。在ASP.NET MVC3應用程序中同時有多個身份驗證提供程序?

在服務器上,我有以下控制措施:

[Authorize] 
    [HttpPost] 
    public JsonResult RecieveChunk(string id, [ModelBinder(typeof(AudioChunkModelBinder))] byte[] audio) 
     { 
      //Process chunk 

      var chunk = new AudioChunk 
      { 
       ThoughtId = Guid.Parse(id), 
       Data = audio 
      }; 

      //Process chunk by BL 

      return new JsonResult {Data = "Success"}; 
     } 

目前,內置AspNetMemebershipProvider正在處理的授權,所以客戶端應用程序必須先在登錄頁面進行驗證,獲取餅乾到一個CookieContainer然後打電話給服務器上傳一大塊數據。

我想允許客戶端也能夠匿名上傳音頻文件到服務器,而無需以前註冊。他們的客戶端應用程序代碼將在每次從同一設備上傳文件時提供相同的guid。

我希望這兩類用戶共享相同的RecieveChunk操作。但是它們必須以匿名形式(只有​​)或登錄/合併組合進行驗證。

我可以將兩個不同的控制器鏈接到兩個不同的身份驗證提供程序嗎?第三個控制器具有[Authorize]標記的操作,如果其中一個提供者向用戶提供cookie(或其他認證方法),則允許執行操作。

在ASP.NET MVC3中一般可能嗎?

+0

從你這裏說的是什麼,你的上傳行動不*要求授權,所以不應該具有該屬性。相反,您應該使用Action中的代碼來確定它們是否已登錄,並據此採取行動。 – 2012-01-19 00:35:19

+0

是的,這就是我正在做的。所以我假設答案只是 - 不,只有一個成員資格提供程序的實現在整個應用程序範圍內同時執行? – 2012-01-19 00:40:54

+0

嗯,不;這不是你在做什麼。您有那裏的授權屬性。此外,根據定義,匿名用戶*未經過身份驗證*。所以你要找的是*不是*多個會員提供商。 – 2012-01-19 00:43:12

回答

1

正如評論中所述,您可以創建FilterAttribute class的自定義實現並實現IAuthorizationFilter interface。例如這裏是ChildActionOnlyAttribute實現:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ChildActionOnlyAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (filterContext == null) 
     throw new ArgumentNullException("filterContext"); 
    if (!filterContext.IsChildAction) 
     throw Error.ChildActionOnlyAttribute_MustBeInChildRequest(filterContext.ActionDescriptor); 
    } 
} 

這裏是RequireHttpsAttribute實現:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class RequireHttpsAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public virtual void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (filterContext == null) 
     throw new ArgumentNullException("filterContext"); 
    if (filterContext.HttpContext.Request.IsSecureConnection) 
     return; 
    this.HandleNonHttpsRequest(filterContext); 
    } 

    protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext) 
    { 
    if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
     throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl); 
    string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl; 
    filterContext.Result = (ActionResult) new RedirectResult(url); 
    } 
} 

所以,你可以這樣做:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (filterContext == null) 
     throw new ArgumentNullException("filterContext"); 

    var guidPresent = CheckForGuid(); 

    if (!filterContext.HttpContext.User.Identity.IsAuthenticated && !guidPresent) 
     throw new InvalidOperationException("Must authenticate properly") 
    } 
} 
相關問題