Подтвердить что ты не робот

Как создать объект 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 = ?????
}
4b9b3361

Ответ 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 об этом.