Propriétés de l'attribut Autoriser les API Web personnalisées
Je suis en train de s'étendre par défaut de l'Api Web autoriser attribut pour permettre à des utilisateurs authentifiés ont accès à un ensemble d'actions, même si elles ne sont pas enregistrées dans l'application (par exemple, ils n'ont pas un rôle).
public class AuthorizeVerifiedUsersAttribute : AuthorizeAttribute
{
///<summary>
///Gets or sets the authorized roles.
///</summary>
public new string Roles { get { return base.Roles; } set { base.Roles = value; } }
///<summary>
/// Gets or sets the authorized users.
///</summary>
public new string Users { get { return base.Users; } set { base.Users = value; } }
private bool _bypassValidation;
///<summary>
///Gets of sets a controller or an action as an authorization exception
///</summary>
public virtual bool BypassValidation
{
get
{
Debug.WriteLine("get:" + TypeId.GetHashCode() + " " + _bypassValidation);
return _bypassValidation;
}
set
{
Debug.WriteLine("set:" + TypeId.GetHashCode() + " " + value);
_bypassValidation = value;
}
}
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (BypassValidation)
{
return true;
}
else
{
//return false if user is unverified
}
}
return base.IsAuthorized(actionContext);
}
}
Et il est utilisé comme ceci:
[AuthorizeVerifiedUsers]
public class UserProfileController : ApiController
{
[AuthorizeVerifiedUsers(BypassValidation = true)]
public bool Verify(string verificationCode)
{}
}
Jusqu'à présent, cette action est la seule qui est à l'aide de la BypassValidation = true.
La question se pose parce que la BypassValidation propriété est fausse pour l'action, même si la fenêtre de Débogage utilisés dans le BypassValidation bien - affiche les éléments suivants:
ensemble:26833123 Vrai
set:39602703 Vrai
obtenir:43424763 Faux
obtenir:43424763 Faux
obtenir:43424763 Faux //appel qui devrait avoir une "Vrai"...
J'ai remarqué deux choses:
- Le TypeId (l'identificateur unique de L'attribut) est différente entre les appels qui ont BypassValidation = true et ceux qui ont BypassValidation = false.
- L'id '43424763' ne dispose pas d'un ensemble correspondant
Des idées?
Merci d'avance,
Joao
source d'informationauteur JCS
Vous devez vous connecter pour publier un commentaire.
Le Web API travaille, c'est que l'autoriser attribut est appelé à la portée parent, dans ce cas, le contrôleur et le remplacer (autoriser l'attribut de l'action) doit être effectuée en manuellement (corrigez-moi si je me trompe).
Donc une solution qui pourrait ressembler à la suivante:
Un peu trop tard, mais pour d'autres utilisateurs avec des problèmes similaires: Web API 2 vous pouvez remplacer tous les anciens attributs d'autorisation (global d'autorisation de filtres, contrôleur d'attributs d'autorisation, etc.) à l'aide de "OverrideAuthorization" et après il suffit d'utiliser l'Autoriser attribut, sans préciser le rôle. Le comportement par défaut de l'Autoriser attribut est juste pour vérifier si l'utilisateur est authentifié.
Dans ce cas: