2016-02-03 1 views
1

В моей MVC 5 приложения я декорировать свои контроллеры следующим образом:Как я могу разработать пользовательский атрибут AuthorizeAttribute, который принимает логин или токен?

[Authorize] 
public class Controller 
{ 
    .. 

Однако одно требование, у меня есть, чтобы использовать маркер для авторизации действия, не выходя на экран входа в систему. то есть: http://{website}/Action?token={/* token for this user */}

Таким образом, Как я могу разработать пользовательский атрибут AuthorizeAttribute, который принимает логин (поведение по умолчанию) ИЛИ токен (обычное, обязательное поведение)?

Другими словами, если я использую http://{website}/Action, я бы перенаправлен на экран входа в систему (если я не авторизован), но если я использую http://{website}/Action?token={/* token for this user */}, я был бы уполномочен и перенаправляется на упомянутое действие.


[TokenAuthorize] класс

public class TokenAuthorize : AuthorizeAttribute 
{ 
    private const string SecureToken = "token"; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (Authorize(filterContext)) 
     { 
      return; 
     } 

     HandleUnauthorizedRequest(filterContext); 
    } 

    private bool Authorize(AuthorizationContext actionContext) 
    { 
     try 
     { 
      HttpRequestBase request = actionContext.RequestContext.HttpContext.Request; 
      string token = request.Params[SecureToken]; 

      return SecurityManager.IsTokenValid(token); 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
} 

Если я декорировать свои контроллеры с:

[Authorize] 
[TokenAuthorize] 
public class Controller 
{ 
    .. 

Говорится Authorize И TokenAuthorize(1). Мне нужно разработать способ обработки, такой как Authorize OR TokenAuthorize

ответ

0

кроссовок answer привел меня на правильном пути.

я реализовал свое предложение и сделал следующее в моей Authorize функции:

private bool Authorize(AuthorizationContext actionContext) 
{ 
    try 
    { 
     HttpContextBase context = actionContext.RequestContext.HttpContext; 
     string token = context.Request.Params[SecurityToken]; 

     bool isTokenAuthorized = SecurityManager.IsTokenValid(token); 
     if (isTokenAuthorized) return true; 

     bool isDefaultAuthorized = AuthorizeCore(context); 
     return isDefaultAuthorized; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

Декорирование только [TokenAuthorize], я могу разрешить действие с помощью авторизации (по умолчанию) или с помощью маркеров.

2

Как насчет украшения только TokenAuthorize, а затем возвращается к поведению по умолчанию, если не существует токена?

TokenAuthorize.cs

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    bool isTokenAuthorized = HasValidToken(...); 
    if(isTokenAuthorized) return true; 

    bool isDefaultAuthorized = base.AuthorizeCore(httpContext); 
    if(isDefaultAuthorized) return true; 

    return false; 
} 

MyController.cs

[TokenAuthorize] 
public class MyController 
{ 
    ... 
} 
Смежные вопросы