Web API 2 OWIN Идентификация маркера предъявителя - AccessTokenFormat null?
Конечные точки по умолчанию /Token работают нормально, и я могу получить токен оттуда, но мне нужно использовать метод AccessTokenFormat.Protect в билете для создания accessToken для externalLogin.
В основном моя реализация почти такая же, как и эта, и я столкнулся с той же проблемой, что и AccessTokenFormat. В документации говорится:
Формат данных, используемый для защиты информации, содержащейся в токене доступа. Если это не предусмотрено приложением, поставщик защиты данных по умолчанию зависит от хост-сервера. Хост SystemWeb в IIS будет использовать защиту данных машинного ключа ASP.NET, а HttpListener и другие самообслуживаемые серверы будут использовать защиту данных DPAPI. Если назначен другой поставщик или формат доступа к токену, совместимый экземпляр должен быть присвоен свойству OAuthBearerAuthenticationOptions.AccessTokenProvider или OAuthBearerAuthenticationOptions.AccessTokenFormat ресурсного сервера.
Мне кажется, что если AccessTokenFormat не назначен, хост предоставит ему базовую реализацию. Но я не вижу, чтобы это работало здесь. Есть ли способ найти стандартную реализацию ISecureDataFormatAccessTokenFormat и назначить ее переменной вручную?
Или у кого-нибудь есть другие идеи, как решить это?
UPDATE: Я получаю исходный код для katana и нахожу класс OAuthAuthorizationServerMiddleware, из исходного кода я могу видеть следующий код:
if (Options.AccessTokenFormat == null)
{
IDataProtector dataProtecter = app.CreateDataProtector(
typeof(OAuthAuthorizationServerMiddleware).Namespace,
"Access_Token", "v1");
Options.AccessTokenFormat = new TicketDataFormat(dataProtecter);
}
В моем Startup.Auth, вот мой код:
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
OAuthOptions = new OAuthAuthorizationServerOptions()
{
TokenEndpointPath = new PathString("/Token"),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
OAuthBearerOptions.AccessTokenFormat = OAuthOptions.AccessTokenFormat;
OAuthBearerOptions.AccessTokenProvider = OAuthOptions.AccessTokenProvider;
OAuthBearerOptions.AuthenticationMode = OAuthOptions.AuthenticationMode;
OAuthBearerOptions.AuthenticationType = OAuthOptions.AuthenticationType;
OAuthBearerOptions.Description = OAuthOptions.Description;
OAuthBearerOptions.Provider = new CustomBearerAuthenticationProvider();
OAuthBearerOptions.SystemClock = OAuthOptions.SystemClock;
}
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.UseOAuthAuthorizationServer(OAuthOptions);
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
// 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
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
У меня также есть следующее в WebApiConfig
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
Я не уверен, почему
app.UseOAuthAuthorizationServer(OAuthOptions);
не устанавливает параметр accessTokenFormat