Uwierzytelnianie wielu tokenów aplikacji OWIN

Chcę zmodyfikować domyślny szablon aplikacji jednostronicowej dla ASP.NET w VS 2013, który obecnie wykorzystuje uwierzytelnianie tokenu nośnika. W przykładzie użyto aplikacji UseOutBearerTokens, aby utworzyć zarówno serwer tokenów, jak i oprogramowanie pośrednie do sprawdzania poprawności tokenów dla żądań w tej samej aplikacji.

Chciałbym to zostawić, ale dodać drugą aplikację (powiązaną w IIS do tej samej domeny, inną ścieżkę - np. / Auth / * dla serwera uwierzytelniania i / app1 / * dla aplikacji). W przypadku drugiej aplikacji chcę, aby akceptowała tokeny wydane przez serwer uwierzytelniania w pierwszej aplikacji. Jak można to osiągnąć? Próbowałem wykonać następujące czynności w Startup.Auth.cs po prostu wyłączając kod w UseOAuthBearerTokens, ale otrzymałem 401 odpowiedzi na wszelkie żądania z atrybutem [Autoryzuj]:

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);
        }
    }

Oczywiście brakuje mi części, w której druga aplikacja ma jakiś sposób na potwierdzenie, że tokeny pochodzą z pierwszej aplikacji. Jakiś publiczny klucz podpisu?

To tylko dla potwierdzenia koncepcji.

Edycja: Sugestia klucza maszynowego działała wystarczająco dobrze dla wersji demonstracyjnej POC i dobrze jest wiedzieć, że istnieją opcje implementacji AS, które obsługują inne kluczowe scenariusze.

Za pomocą tej strony udało mi się wygenerować klucz DEMO (nie używać do produkcji):http://aspnetresources.com/tools/machineKey

I umieścił wynik pod<system.web> element w web.config każdej aplikacji hostowanej w witrynie IIS. Musiałem także usunąć niektóre opcje konfiguracyjne specyficzne dla AS w klasie Autostart serwera zasobów.

questionAnswers(4)

yourAnswerToTheQuestion