2016-02-03 2 views
1

Dans mon MVC 5 application, je décore mes contrôleurs comme suit:Comment puis-je développer un AuthorizeAttribute personnalisé qui accepte un login OU un token?

[Authorize] 
public class Controller 
{ 
    .. 

Cependant, une condition que j'ai est d'utiliser un jeton pour autoriser une action sans passer à l'écran de connexion. par exemple: http://{website}/Action?token={/* token for this user */}

Ainsi, Comment développer un AuthorizeAttribute personnalisé qui accepte un login (comportement par défaut) OU un jeton (comportement personnalisé, requis)?

En d'autres termes, si j'utilise http://{website}/Action, je serais redirigés vers l'écran de connexion (si je ne suis pas autorisé), mais si je l'utilise http://{website}/Action?token={/* token for this user */}, je serais autorisé et redirigés à ladite action.


[TokenAuthorize] classe

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; 
     } 
    } 
} 

Si je décore mes contrôleurs avec:

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

Il est traité comme Authorize ET TokenAuthorize(1). Je dois développer un moyen de traiter comme Authorize ou TokenAuthorize

Répondre

0

de answer chaussure m'a conduit sur la bonne voie.

Je mis en œuvre sa suggestion et a fait ce qui suit dans ma Authorize fonction:

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; 
    } 
} 

Décorer avec juste [TokenAuthorize], je peux autoriser une action via connexion (par défaut) ou par jeton.

2

Que diriez-vous de décorer avec seulement TokenAuthorize puis de revenir au comportement par défaut si aucun jeton n'existe?

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 
{ 
    ... 
}