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 обрабатывает разрешение, так что приложение клиент должен сначала пройти аутентификацию на странице входа в систему, получить куки в a CookieContainer, а затем сделать звонок на сервер для загрузки фрагмента данных.

Я хочу, чтобы клиенты могли также анонимно загружать аудиофайлы на сервер, без предварительной регистрации. Они представляют собой клиентский код приложения каждый раз, когда файл загружается с одного и того же устройства.

Я хочу, чтобы обе категории пользователей разделили одно и то же действие RecieveChunk, чтобы сделать это. Но они должны быть авторизованы либо анонимно (всего лишь guid), либо с помощью комбинации входа/выхода.

Могу ли я иметь два разных контроллера, связанных с двумя разными поставщиками аутентификации? Третий контроллер, который имеет отмеченное действие [Authorize], допустит действие, если один из провайдеров предоставил пользователю cookie (или какой-либо другой метод auth).

Возможно ли вообще в ASP.NET MVC3?

+0

Из того, что вы говорите здесь, ваша загрузка действие не требует авторизации, и поэтому не должно иметь этого атрибута. Вместо этого вы должны использовать код в действии, чтобы определить, вошли ли они в систему или нет, и действовать соответствующим образом. –

+0

Да, это то, что я делаю. Поэтому я предполагаю, что ответ просто ... Нет, только одна реализация провайдера членства действует одновременно в масштабе всего приложения? –

+0

Умм, нет; это не то, что вы делаете. У вас есть атрибут Authorize. Кроме того, анонимные пользователи по определению * не аутентифицированы *. Итак, что вы ищете, это * не * несколько поставщиков членства. –

ответ

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") 
    } 
} 
Смежные вопросы