This project has moved. For the latest updates, please go here.

Sign in with custom OpenId provider

Jun 29, 2013 at 6:26 PM
Is there a simple way of using a custom OpenId provider? I am looking at the new MVC5 templates and was expecting it to be as simple as MVC4. e.g.
OAuthWebSecurity.RegisterClient(new OpenIdClient("Steam", Identifier.Parse("http://steamcommunity.com/openid")), "Steam", null);
Jul 26, 2013 at 12:41 AM
There's no equivalent generic OpenIdClient middleware currently but this is something that should be relatively straightforward to write, which might look something like app.useOpenIdAuth("<openid config>");
Jan 6, 2014 at 5:58 AM
I have implemented an OpenID provider and a Steam specific one: https://github.com/laedit/OwinOAuthProviders.
Tell me what you think :)
Jan 24, 2014 at 6:21 AM
It has been integrated in the nuget package Owin.Security.Providers 1.2.0.
Jan 26, 2014 at 12:02 PM
Géant! ;)

Deux trois remarques toutefois:
  • Je n'ai pas été capable de faire fonctionner le fournisseur OpenID avec l'implémentation qui en est faite par Orange (http://openid.orange.fr/). En effet, ça semble coincer au niveau de la découverte Yadis, très vraisemblablement dans la requête LINQ to XML qui vise à déterminer l'adresse réelle du fournisseur:
[NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.]
   Owin.Security.Providers.OpenID.OpenIDAuthenticationHandlerBase`1.<DoYadisDiscovery>b__25(XElement service) +36
   System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count) +92
   System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count) +21
   System.Linq.<GetEnumerator>d__0.MoveNext() +179
   System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +85
   System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +164
   Owin.Security.Providers.OpenID.OpenIDAuthenticationHandlerBase`1.DoYadisDiscovery() +1797
   Owin.Security.Providers.OpenID.OpenIDAuthenticationHandlerBase`1.ApplyResponseChallengeAsync() +152
  • Il serait peut-être bien de rendre la propriété OpenIDAuthenticationOptions.ProviderLoginUri publique afin de permettre aux utilisateurs avancés de renseigner directement l'adresse du fournisseur et de rendre la découverte Yadis facultative, permettant ainsi d'éviter le "coût" d'une découverte complète.
  • A titre personnel, je pense que remplacer les très nombreux .Wait() et .Result de ton code par des méthodes async et des appels await pourrait renforcer le caractère asynchrone de ton fournisseur et ainsi permettre une meilleure montée en charge.
A part ça, c'est du tout bon, merci à toi d'avoir pris la peine de te pencher sur la question ;)
Jan 26, 2014 at 5:47 PM
Merci pour les retours, je vais me pencher sur le bug de l'OpenId Orange. :)
Concernant la propriété ProviderLoginUri c'est une bonne idée, je vais également me pencher dessus.
Par contre pour les Wait() et Result, le problème vient du fait qu'une des méthodes héritée n'est pas Async, empêchant ainsi le reste des méthodes de l'être. Après je ne suis pas un spécialiste de l'async, donc j'ai peut-être zappé quelque chose qui permettrait de l'utiliser.
Jan 26, 2014 at 5:57 PM
Edited Jan 26, 2014 at 5:58 PM
A priori, la grande majorité des méthodes liées à l'authentification retournent des tâches, ce qui en fait de bonnes candidates pour le pattern async/await (quand bien même les méthodes parentes que tu surchargerais n'utiliseraient pas async/await... ça n'est là qu'un détail de compilation, si telle était ta crainte ;)).

Par exemple, tu peux appliquer le mot-clé await sur la méthode surchargée suivante:
protected override async Task ApplyResponseChallengeAsync()
Et ainsi y utiliser await sur ton appel vers DoYadisDiscovery...
await DoYadisDiscoveryAsync();
... que tu devras transformer en méthode asynchrone:
private async Task DoYadisDiscoveryAsync()
... et ainsi de suite, jusqu'à remplacer tous tes appels bloquants par de vrais appels asynchrones.

Pour ma part, j'ai un fournisseur OAuth2 générique en stock, je vais essayer de voir si je peux faire un PR sur le même dépôt que toi.
Jan 27, 2014 at 6:19 PM
Les modifications ont été faites sur mon Github et la Pull Request est en cours dans le dépôt originel.
Merci encore pour tes retours ! :)
Jan 28, 2014 at 6:02 AM
And all have been integrated in the nuget package Owin.Security.Providers 1.2.1.