OWIN Multi-App-Inhaber-Token-Authentifizierung

Ich möchte eine Änderung an der standardmäßigen Anwendungsvorlage für eine einzelne Seite für ASP.NET in VS 2013 vornehmen, die derzeit die Bearer-Token-Authentifizierung verwendet. Im Beispiel wird app.UseOAuthBearerTokens verwendet, um sowohl den Tokenserver als auch die Middleware zu erstellen, um Tokens für Anforderungen in derselben App zu validieren.

Ich würde das gerne beibehalten, aber eine zweite Anwendung hinzufügen (in IIS an dieselbe Domäne gebunden, anderer Pfad - z. B. / auth / * für den Authentifizierungsserver und / app1 / * für die App). Für die zweite App möchte ich, dass sie Token akzeptiert, die vom Authentifizierungsserver in der ersten App ausgegeben wurden. Wie könnte dies erreicht werden? Ich habe in Startup.Auth.cs versucht, den Code in UseOAuthBearerTokens einfach zu verlassen, aber ich erhalte 401 Antworten auf alle Anfragen mit dem 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);
        }
    }

Offensichtlich fehlt mir der Teil, in dem die zweite App auf irgendeine Weise bestätigt, dass die Token von der ersten App stammen. Ein öffentlicher Signaturschlüssel?

Dies ist nur ein Proof of Concept.

Bearbeiten: Der Maschinenschlüsselvorschlag hat für die POC-Demo gut funktioniert, und es ist gut zu wissen, dass es AS-Implementierungsoptionen gibt, die andere Schlüsselszenarien unterstützen.

Ich konnte über diese Site einen DEMO-Schlüssel generieren (nicht für die Produktion verwenden):http://aspnetresources.com/tools/machineKey

Und legte das Ergebnis unter die<system.web> Element in der web.config jeder auf der IIS-Site gehosteten App. Ich musste auch einige der AS-spezifischen Konfigurationsoptionen in der Startup-Klasse des Ressourcenservers entfernen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage