Как создать объект ClaimsIdentity для Asp.NET MVC 5?
Я работаю в приложении .NET MVC 5. Я не хочу использовать Entity Framework. Я хочу выполнить аутентификацию в базе данных RavenDB. Мне кажется, что я хочу заменить UserManager
, который поставляется с контроллером учетных записей. Я думаю, что я могу переписать все функции UserManager для работы с моей базой данных, кроме того, что я не понимаю объект ClaimsIdentity
.
В методе SignInAsync
есть вызов UserManager.CreateIdentityAsync(...)
. Я знаю, что он возвращает объект ClaimsIdentity
. Я не знаю, как создать объект ClaimsIdentity самостоятельно.
Я вижу, что он имеет 4 свойства Actor
, BootstrapContext
, Claims
и Label
. Я не знаю, для чего используются эти свойства, и я не знаю, как правильно их генерировать. Я предполагаю, что их правильное создание важно, поскольку именно так создается cookie аутентификации.
Я рассмотрел объяснение объекта ClaimsIdentity здесь, но это не помогло мне понять.
Если бы я мог видеть код для CreateIdentityAsync()
, это, вероятно, помогло бы.
Если я все это сделаю неправильно, сообщите мне. В противном случае, если кто-то может указать мне, как создать объект ClaimsIdentity, это было бы полезно.
ClaimsIdentity identity = new ClaimsIdentity
{
Actor = ????,
BootstrapContext = ?????,
Claims = ?????,
Label = ?????
}
Ответы
Ответ 1
Возможно, следующая ссылка может помочь:
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "Brock"));
claims.Add(new Claim(ClaimTypes.Email, "[email protected]"));
var id = new ClaimsIdentity(claims,DefaultAuthenticationTypes.ApplicationCookie);
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(id);
Ответ 2
Я думаю, что вы "все это неправильно". Рамка ASP.NET Identity Framework разработана с учетом наглядности. Правильный способ заменить RavenDB для EF НЕ заменить UserManager
. Скорее, это реализовать замену UserStore
. Таким образом, строка в AccountController
, которая создает UserManager
, изменится с:
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
To:
public AccountController()
: this(new UserManager<ApplicationUser>(new RavenDBUserStore<ApplicationUser>/* connection info here*/)))
Если RavenDBUserStore
будет классом, на котором вы написали, что реализованы IUserStore
, IUserPasswordStore
и любые другие интерфейсы * Store, необходимые для вашего конкретного приложения.
Этот подход позволяет избежать необходимости понимать и повторно реализовывать все в UserManager
и гарантирует, что вы сможете использовать будущие улучшения в UserManager
от MS.
Для получения дополнительной информации о том, как это сделать, см. Обзор пользовательских поставщиков хранилищ для удостоверения ASP.NET и пример Внедрение пользовательского поставщика хранилища удостоверений ASP ASP.NET. Вы также должны проверить код RavenDB.AspNet.Identity Nuget Package, созданный David Boike, упомянутый в его . Источник находится на github в https://github.com/ILMServices/RavenDB.AspNet.Identity/tree/master/RavenDB.AspNet.Identity
Ответ 3
Вот что я придумал. Я хотел бы знать, правильно ли это выполнить эту задачу.
Работая на веб-сайте MVC5 по умолчанию, я пошел в Контроллер учетной записи и нашел функцию SignInAsync()
. Я скорректировал его следующим образом:
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
//var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); --> this is where I want to get rid of UserManager
List<Claim> claims = new List<Claim>{
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", user.Name), //user.Name from my database
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", user.Id), //user.Id from my database
new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "MyApplication"),
new Claim("FirstName", user.FirstName) //user.FirstName from my database
};
ClaimsIdentity identity = new System.Security.Claims.ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
Имейте в виду, что это также требует изменения функции [HttpPost] Login
, чтобы получить пользователя из моей базы данных вместо использования функции UserManager.FindAsync()
.
Части Logon/LogOff сайта по умолчанию, похоже, работают нормально после этих настроек. Я оставлю этот ответ здесь некоторое время, прежде чем принять его, если кто-то скажет мне, почему я не должен так поступать.
Ответ 4
Я создал реализацию RavenDB для новой ASP.NET MVC 5 Identity и выпустил ее как пакет NuGet. Это может сработать для вас.
http://www.nuget.org/packages/RavenDB.AspNet.Identity/
Это несколько предварительная публикация, но я использую ее в реальном проекте.
Здесь проект GitHub и короткий поток в группе обсуждения RavenDB об этом.