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.