Я пытаюсь настроить OAuth для сайта MVC5 (в VS2012).
Я использую Fluent NHibernate. Я установил свой собственный Userstore и передал объект репозитория для доступа к объекту сеанса NHibernate. Я передаю свой магазин в поставщик aspnet usermanager по умолчанию. Это в конечном итоге работало для локальной регистрации и входа в систему. Я не пытаюсь настроить подключение/регистрацию с помощью Facebook.
Он получает успешную учетную запись. Добавляет пользователя в пользовательскую таблицу, добавляет запись в таблицу логинов и затем взрывается. Я не реализую заявки в хранилище пользователей или помещаю коллекцию претензий в объект пользователя. (не уверен, что это действительно необходимо, я все время отбрасывал все, что могло бы пойти не так, чтобы найти источник проблемы).
Линия, которая взрывается, - это (в контроллере учетной записи):
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
в этом методе:
private async Task SignInAsync(IdentityUser user, bool isPersistent)
это конец трассировки стека
[ArgumentNullException: Value cannot be null.
Parameter name: value]
System.Security.Claims.Claim..ctor(String type, String value, String valueType, String issuer, String originalIssuer, ClaimsIdentity subject, String propertyKey, String propertyValue) +14108789
System.Security.Claims.Claim..ctor(String type, String value, String valueType) +62
Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +481
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +49
Web.Controllers.<SignInAsync>d__42.MoveNext() in d:\Google Drive\Development\GoalManagement\Web\Controllers\AccountController.cs:375
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84
Web.Controllers.<ExternalLoginConfirmation>d__35.MoveNext() in d:\Google Drive\Development\GoalManagement\Web\Controllers\AccountController.cs:311
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84
public class IdentityUser : IUser
{
public IdentityUser()
{
Logins = new List<IdentityUserLogin>();
}
public string Id { get; set; }
public string UserName { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
public IList<IdentityUserLogin> Logins { get; set; }
}
public class IdentityUserLogin
{
public string LoginProvider { get; set; }
public string ProviderKey { get; set; }
}
Я могу включить свой код userstore, если захочу: я не помещал его в него как большой файл и мог бы отвлечься от проблемы.
Я не уверен, почему он даже пытается создать объект претензии и почему он взрывается. Поскольку у меня только VS2012, я все время собирал все это из примеров в Интернете.
Как было предложено @Shoe, я унаследовал от UserManager
:
public class NHibernateAspnetUserManager<TUser> : UserManager<TUser> where TUser : IdentityUser
{
public NHibernateAspnetUserManager(IUserStore<TUser> store) : base(store)
{
}
public override Task<ClaimsIdentity> CreateIdentityAsync(TUser user, string authenticationType)
{
ClaimsIdentity identity = new ClaimsIdentity();
return Task.FromResult(identity);
}
}
Теперь он больше не выдает ошибку, но фактически не аутентифицирует меня, как много раз я использую регистр/логин Facebook.
Подводя итог. С помощью @Shoe info я попробовал как переопределить UserManager.CreateIdentityAsync
с помощью:
public override Task<ClaimsIdentity> CreateIdentityAsync(TUser user, string authenticationType)
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
return Task.FromResult(identity);
}
а также пытается реализовать IUserClaimStore с возвращаемым по умолчанию (пустым списком).
Первый не будет проходить через ошибку, но не завершится аутентификацией. Позже будет по-прежнему нечетное требование "Ошибка System.Security.Claims.Claim..ctor"
ИЗМЕНИТЬ
Узнал, почему произошла ошибка ctor. Пользовательский объект возвращался без идентификатора, поэтому по умолчанию UserManager
расстраивался. Исправлено это и использовалось значение по умолчанию UserManager
, которое теперь больше не выдает ошибку, но все равно не регистрирует пользователя. Объект идентификации, который он возвращает, выглядит хорошо из того, что я могу сказать.