Использование объектов Claim

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Объекты Claim позволяют нам сохранять дополнительную информацию, связанную с текущим пользователем. Например, возьмем новый стандартный проект, использующий аутентификацию Individual User Accounts и изменим в нем класс ApplicationUser, который находится в файле IdentityModels.cs:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
		userIdentity.AddClaim(new Claim(ClaimTypes.Gender, this.Gender));
        userIdentity.AddClaim(new Claim("age", this.Age.ToString()));
        return userIdentity;
    }

    public int Age { get; set; }
    public string Gender { get; set; }
}

Мы определили два дополнительных свойства в классе ApplicationUser. И также для каждого дополнительного свойства добавили соответсвующий объект claim. Вызов метода GenerateUserIdentityAsync, который уже имеется в классе по умолчанию, возвращает нам объект ClaimsIdentity, для которого сообственно и производится добавление claims.

Добавление очень просто: используем метод AddClaim, в который передаем новый Claim. Объект Claim принимает два зачения: тип клейма в виде строки и его строковое значение. По умолчанию фреймворк содержит ряд констнатных значений для типов claim в перечислении ClaimTypes, однако этот набор ограниченный, поэтому для сохранения возраста используется строка "age", так как ClaimTypes не содержит нужного типа.

Чтобы пользователь смог задать эти данные при регистрации, изменим модель регистрации RegisterViewModel (нахдящаяся в файле AccountViewModels.cs), которая будет содержать все эти свойства:

public class RegisterViewModel
{
    [Required]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "Age")]
    public int Age { get; set; }

    [Required]
    [Display(Name = "Gender")]
    public string Gender { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

Соответственно нам надо изменить и представление регистрации, например, следующим образом:

@model ClaimsApp.Models.RegisterViewModel
@{
    ViewBag.Title = "Register";
    Layout = null;
}

<h2>@ViewBag.Title.</h2>

@using (Html.BeginForm("Register", "Account", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <div>
    @Html.LabelFor(m => m.Email)
		<div>
			@Html.TextBoxFor(m => m.Email)
		</div>
	</div>
    <div>
        @Html.LabelFor(m => m.Password)
        <div>
            @Html.PasswordFor(m => m.Password)
        </div>
    </div>
    <div>
        @Html.LabelFor(m => m.ConfirmPassword)
        <div>
            @Html.PasswordFor(m => m.ConfirmPassword)
        </div>
    </div>
    
<div>
    @Html.LabelFor(m => m.Age)
    <div>
        @Html.TextBoxFor(m => m.Age)
    </div>
</div>
<div>
    @Html.LabelFor(m => m.Gender)
    <div>
        @Html.RadioButtonFor(m => m.Gender, "женский")
        <span>женский</span>
    </div>
    <div>
        @Html.RadioButtonFor(m => m.Gender, "мужской")
        <span>мужской</span>
    </div>
</div>
<br />
    <div>
        <div>
            <input type="submit" value="Register" />
        </div>
    </div>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

И в методе Register контроллера AccountController изменим создание нового пользователя:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Age=model.Age, Gender=model.Gender };
//...............................................................................

И чтобы проверить в действии этот функционал, определим в контроллере HomeController новое действие:

public string GetInfo()
{
    var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
    var email = HttpContext.User.Identity.Name;
    var gender = identity.Claims.Where(c => c.Type == ClaimTypes.Gender).Select(c => c.Value).SingleOrDefault();
    var age = identity.Claims.Where(c => c.Type == "age").Select(c => c.Value).SingleOrDefault();
    return "<p>Эл. адрес: " + email + "</p><p>Пол:"+gender +"</p><p> Возраст:"+age+"</p>";
}

Итак, зарегистрируемся:

Теперь обратимся к действию GetInfo:

Таким образом, благодаря использованию claims мы можем сохранять ряд важной информации, связанной с текущим пользователем, и уменьшить количество обращений к бд для получения этой информации.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850