L'ajout de la logique supplémentaire pour le Porteur de l'autorisation
Je tente de mettre en œuvre OWIN porteur du jeton d'autorisation, et sur la base cet article. Cependant, il y a une autre information dont j'ai besoin porteur du jeton que je ne sais pas comment la mettre.
Dans mon application, j'ai besoin d'en déduire le porteur du jeton de l'utilisateur (dire userid). Ceci est important parce que je ne veux pas un utilisateur autorisé d'être en mesure d'agir en tant qu'un autre utilisateur. Est-ce faisable? Est-il même la bonne approche? Si le code d'utilisateur est un guid, alors ce serait simple. C'est un entier dans ce cas.
Un utilisateur autorisé peut, potentiellement, d'usurper l'identité d'un autre juste en devinant /la force brute, ce qui est inacceptable.
En regardant ce code:
public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
//Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
using (AuthRepository _repo = new AuthRepository())
{
IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
Je pense qu'il est possible de remplacer l'autorisation et d'authentification pour accueillir ce dont j'ai besoin?
OriginalL'auteur Echiban | 2014-06-21
Vous devez vous connecter pour publier un commentaire.
Il semble qu'il ya quelque chose qui manque dans votre code.
Vous n'êtes pas de la validation de votre client.
Vous devez mettre en œuvre ValidateClientAuthentication et de vérifier vos informations d'identification du client.
C'est ce que je fais:
Un bon article, plein de détails peuvent être trouvés ici.
Une encore meilleure explication peut être trouvée dans cette blog de la série.
Mise à JOUR:
J'ai fait quelques recherches et webstuff est droit.
Afin de passer
errorDescription
pour le client, nous devons Rejeté avant de l'erreur avecSetError
:ou on peut l'étendre en passant sérialisé objet json dans la description:
Avec un
javascript/jQuery
client nous pourrions désérialiser le texte de la réponse et de lire le message étendu:Si vous avez besoin de plus d'info il y a un nouveau lien dans ma réponse. Taisser blog sur owin et api web est grand et plein d'infos utiles. des acclamations.
si j'ai besoin de passer 2 les valeurs de retour, puis-je appeler SetError deux fois?
Je l'ai étendu ma réponse avec quelques infos qui pourraient vous aider.
merci!
OriginalL'auteur LeftyX
Sur une note de côté, si vous souhaitez définir un message d'erreur personnalisé, vous aurez à inverser l'ordre de la
context.Rejected
etcontext.SetError
.Si vous placez
context.Rejected
aprèscontext.SetError
alors la propriétécontext.HasError
sera remis à faux c'est donc la bonne façon de l'utiliser est:Pouvons-nous envoyer un 401 ou 403 erreur? Le seul code d'erreur que je vois est de 400
Peu importe ce que j'essaie et ça fait des jours à essayer plusieurs combinaisons et de http.post Angulaire 6 la demande, je reçois toujours un "Bad Request" littéral de chaîne et ne peut pas obtenir la vraie json error_description. La chose étrange est que je le vois sous Réseau dans l'onglet "Réponse" et il fonctionne aussi sous AngularJS, mais pas Angulaire 6. Toute aide?
OriginalL'auteur webStuff
Juste à ajouter sur LeftyX réponse, voici comment vous pouvez complètement contrôler la réponse est envoyée au client une fois que le contexte est rejetée. Attention aux commentaires de code.
Basé sur Greg P d'origine de réponse, avec quelques modifications
Etape 1: Créer une classe qui va agir comme votre middleware
espace de noms SignOnAPI.Middleware.ResponseMiddleware
{
Etape 2 : Créer les extensions de la classe (Peut être omis).
Cette étape est facultative, peut être modifié pour accepter les options qui peuvent être transmis à la middleware.
Etape 3: Modifier
GrantResourceOwnerCredentials
méthode dans votreOAuthAuthorizationServerProvider
mise en œuvreEtape 4: Utilisez ce middleware dans le démarrage de classe
OriginalL'auteur Giridhar Karnik