ASP. NET Расширение свойств идентификации - PullRequest
0 голосов
/ 26 апреля 2020

Я использую Asp. Net Идентификация для аутентификации, и мое требование заключается в том, чтобы после входа в систему в настоящее время я могу получить доступ только к User.Identity.Name , который является только именем пользователя.

Is есть какой-то способ добавить дополнительные свойства после входа в систему, например

User.Identity.UserType
User.Identity.DepartmentId

Причина, по которой я хочу использовать это, чтобы избежать сеанса для идентификации пользователя в представлениях.

1 Ответ

0 голосов
/ 26 апреля 2020

Во-первых, вам нужно добавить пользовательские претензии к пользователю. Например, после создания пользователя:

await _userManager.Value.AddClaimAsync(user, new Claim("UserType", "SomeType"));

Затем создайте метод расширения для чтения значения претензии:

public static string GetUserType(this IIdentity identity)
{
    if (identity == null)
        throw new ArgumentNullException(nameof(identity));

    var claim = ((ClaimsIdentity)identity).FindFirst("UserType")?.Value;

    return claim ?? string.Empty;
}

И после входа в систему вы можете получить доступ к типу пользователя:

var userType = User.Identity.GetUserType();

А вот расширение c для получения пользовательского утверждения:

public static T Get<T>(this IIdentity identity, string propertyName)
{
    if (identity == null)
        throw new ArgumentNullException(nameof(identity));

    var value = ((ClaimsIdentity)identity).FindFirst(propertyName)?.Value;
    if (value == null)
        return default(T);

    var type = typeof(T);
    if (type.IsEnum)
        return (T)Enum.Parse(typeof(T), value);

    return (T)Convert.ChangeType(value, typeof(T));
}

Например, у вас есть перечисление для UserType:

public enum UserType 
{
    Admin,
    Editor,
    User,
}

var userType = User.Identity.Get<UserType>("UserType");
var representativeId = User.Identity.Get<int>("DepartmentId");
...