OWIN multi-application au porteur du jeton d'authentification
Je veux faire une modification de la valeur par défaut page unique modèle d'application pour ASP.NET en VS 2013, qui utilise actuellement porteur du jeton d'authentification. L'exemple utilise l'application.UseOAuthBearerTokens de créer à la fois le jeton serveur et middleware pour valider les jetons pour les demandes dans la même application.
Ce que j'aimerais faire, c'est laisser en place, mais d'ajouter une deuxième application (lié dans IIS pour le même domaine, chemin différent - par exemple, /auth/* pour le serveur d'authentification, et /app1/* pour l'application). Pour la deuxième application, je veux qu'il accepte les jetons émis par le serveur d'authentification dans la première application. Comment cela pourrait-il être réalisé? J'ai essayé ce qui suit dans le Démarrage.Auth.cs juste à aller hors de code en UseOAuthBearerTokens, mais je reçois 401 réponses à toutes les demandes avec l'attribut [Authorize]:
public partial class Startup
{
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
OAuthOptions = new OAuthAuthorizationServerOptions
{
//TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
//AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
//AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
AuthenticationType = "ExternalBearer",
AllowInsecureHttp = true,
};
}
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
public static Func<UserManager<IdentityUser>> UserManagerFactory { get; set; }
public static string PublicClientId { get; private set; }
//For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
////Enable the application to use a cookie to store information for the signed in user
////and to use a cookie to temporarily store information about a user logging in with a third party login provider
//app.UseCookieAuthentication(new CookieAuthenticationOptions());
//app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
OAuthBearerAuthenticationOptions bearerOptions = new OAuthBearerAuthenticationOptions();
bearerOptions.AccessTokenFormat = OAuthOptions.AccessTokenFormat;
bearerOptions.AccessTokenProvider = OAuthOptions.AccessTokenProvider;
bearerOptions.AuthenticationMode = OAuthOptions.AuthenticationMode;
bearerOptions.AuthenticationType = OAuthOptions.AuthenticationType;
bearerOptions.Description = OAuthOptions.Description;
bearerOptions.Provider = new CustomBearerAuthenticationProvider();
bearerOptions.SystemClock = OAuthOptions.SystemClock;
OAuthBearerAuthenticationExtensions.UseOAuthBearerAuthentication(app, bearerOptions);
}
}
public class CustomBearerAuthenticationProvider : OAuthBearerAuthenticationProvider
{
public override Task ValidateIdentity(OAuthValidateIdentityContext context)
{
var claims = context.Ticket.Identity.Claims;
if (claims.Count() == 0 || claims.Any(claim => claim.Issuer != "LOCAL AUTHORITY"))
context.Rejected();
return Task.FromResult<object>(null);
}
}
Évidemment, je suis en manque la partie où la seconde application a une façon de valider le fait que les jetons provenant de la première application. Un public des clés de signature d'un certain type?
C'est juste une preuve de concept.
Edit: La machine suggestion clé fonctionnait assez bien pour le POC démo, et c'est bon à savoir il existe des options de mise en œuvre qui prennent en charge d'autres scénarios.
J'ai été en mesure de générer une clé DÉMO (ne pas utiliser en production) à l'aide de ce site:
http://aspnetresources.com/tools/machineKey
Et placé le résultat sous la <system.web>
élément dans le web.config de chaque application hébergée dans le site IIS. J'ai également eu d'enlever une partie de la configuration spécifique des options dans le Démarrage de classe de la ressource serveur.
OriginalL'auteur Jeremy Bell | 2013-12-16
Vous devez vous connecter pour publier un commentaire.
Actuellement le middleware (ou plutôt le produit de jeton) n'est pas vraiment conçu pour le travail de la croix-application. Pour ces cas, vous devriez plutôt utiliser un vrai serveur d'autorisation (par exemple,https://github.com/thinktecture/Thinktecture.AuthorizationServer).
Qui a dit que vous pourriez obtenir pour fonctionner en synchronisation de la clé machine (machineKey élément dans le web.config) dans les deux applications. Mais je n'ai jamais essayé.
pas de +1 pour l'utilisation de la machine à clé. Été la lutte contre ce genre de choses tous les après-midi et la clé machine ne va pas résoudre mon problème. Tout juste de lancer mon propre IDataProtector et à essayer de comprendre comment obtenir tout dans la chaîne et chaque échantillon, je viens de croiser des gens vomir la machine clés comme c'est le saint graal. Boiteux!
OriginalL'auteur leastprivilege
Par défaut, OWIN utilisation ASP.NET la machine clé de la protection des données à protéger le jeton d'accès OAuth lorsqu'il est hébergé sur IIS. Vous pouvez utiliser MachineKey classe System.Web.dll pour ôter la protection de l'jetons.
Ensuite, la construction d'un TicketDataFormat pour obtenir le AuthenticationTicket objet où vous pouvez obtenir le ClaimsIdentity et AuthenticationProperties.
Pour ôter la protection d'autres OAuth jetons, il vous suffit de changer la _purpose de contenu. Pour des informations détaillées, voir OAuthAuthorizationServerMiddleware classe ici:
http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerMiddleware.cs
OriginalL'auteur Johnny Qian
Bien que les réponses actuellement répertoriés sont très bonne, je l'ai utilisé quelques fois et a eu un grand succès. Réglage de la machine clé dans le web.config fonctionne bien. Assurez-vous d'utiliser le powershell à partir du site de microsoft pour générer votre propre! http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
OriginalL'auteur Bryce
Essayez de créer un personnalisé IDataProtector et configurer votre OAuthAuthorizationServerOptions de la manière suivante.
OriginalL'auteur Ryan Simmen