OWIN аутентификация токенов на нескольких носителях
Я хочу внести изменения в шаблон одностраничного приложения по умолчанию для ASP.NET в VS 2013, который в настоящее время использует аутентификацию токенов на предъявителя. В примере используется app.UseOAuthBearerTokens для создания сервера токенов и промежуточного программного обеспечения для проверки токенов для запросов в одном приложении.
Я хотел бы оставить это на месте, но добавить второе приложение (привязанное в IIS к тому же домену, другой путь - например, / auth / * для сервера аутентификации и / app1 / * для приложения). Для второго приложения я хочу, чтобы оно принимало токены, выданные сервером аутентификации в первом приложении. Как это могло быть достигнуто? Я попробовал следующее в Startup.Auth.cs, просто уходя из кода в UseOAuthBearerTokens, но я получаю 401 ответ на любые запросы с атрибутом [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);
}
}
Очевидно, мне не хватает той части, где у второго приложения есть какой-то способ проверить, что токены пришли из первого приложения. Какой-то публичный ключ подписи?
Это просто для доказательства концепции.
Редактировать: предложение машинного ключа работало достаточно хорошо для демонстрации POC, и хорошо знать, что есть варианты реализации AS, которые поддерживают другие ключевые сценарии.
Мне удалось создать ключ DEMO (не использовать для производства), используя этот сайт:http://aspnetresources.com/tools/machineKey
И поместил результат под<system.web>
элемент в файле web.config каждого приложения, размещенного на сайте IIS. Мне также пришлось удалить некоторые специфичные для AS параметры конфигурации в классе запуска сервера ресурсов.