Я с помощью проверки подлинности OAuth носителя, сконфигурированные как это в Startup.cs:OAuth: ASP.NET Web API User.Identity не загружает требования, установленные ключом аутентификации поставщика
OAuthBearerAuthenticationOptions oAuthBearerOptions =
new OAuthBearerAuthenticationOptions
{
AccessTokenProvider = new AccessTokenProvider(),
AuthenticationMode = AuthenticationMode.Active
};
app.UseOAuthBearerAuthentication(oAuthBearerOptions);
... где AccessTokenProvider реализуется как:
public class AccessTokenProvider : AuthenticationTokenProvider
{
public override async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
// Internal logic to get data needed for building identity...
// Create claims identity
ClaimsIdentity identity = new ClaimsIdentity(identityName);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, nameIdentifier));
// Add other claims
// Set claims identity
context.SetTicket(new AuthenticationTicket(identity, new AuthenticationProperties()));
}
}
Если установить точку останова в конце ReceiveAsync
, я могу подтвердить, что личность построена правильно (есть претензии) и что SetTicket
достигается.
Но когда я пытаюсь получить доступ к идентичности из контроллера Web API:
public abstract class BaseStorageController : ApiController
{
protected IStorageService StorageService;
protected BaseStorageController(IStorageServiceFactory storageServiceFactory)
{
StorageService = storageServiceFactory.CreateStorageService(User.Identity as ClaimsIdentity);
}
}
... список претензий на идентичность пуста!
Что может быть причиной этого?
Боковое примечание: я не знаю, связано ли это, но я использую Castle Windsor в качестве контейнера IOC для ввода зависимостей в мои контроллеры (в приведенном выше случае, IStorageServiceFactory). Выше, казалось, работа (претензии не были пустыми), прежде чем я добавил это. Однако я не использую CW для управления любыми объектами, связанными с аутентификацией. Вот мой установщик CW для контроллеров api:
public class ApiControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly().BasedOn<ApiController>().LifestylePerWebRequest());
}
}
спасибо !!! У меня проблема с конструктором продолжалась весь день и пробовала несколько разных реализаций authprovider. Это решило это. –