Использование типов претензий должным образом в Owin Identity и Asp.Net MVC

Я использую Owin и Identity, и у меня проблема с претензиями.

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

  1. Метод знака на бизнес-уровне может принимать электронную почту или имя пользователя в зависимости от случая.

  2. Чтобы "обфускать" идентификатор пользователя, я использую GUID, уникальный для каждого пользователя, при отображении страницы с информацией о пользователе.

    Я также использую это, потому что иногда адрес электронной почты или имя пользователя может быть проблемой в URL-адресе...

Когда я подписываю пользователя, у меня есть следующие типы претензий:

new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Name, user.FullName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
new Claim(ClaimTypes.NameIdentifier, user.UserUniqueIdentifier.ToString())

Поэтому моя интерпретация такова:

Email is the user email

Name is the user full name

GivenName is the user first name

Surname is the user last name

NameIdentifier is the user unique identifier ... It can be the email, the username or in this case I am using an Unique ID.

Странно, нет ли типа претензий для имени пользователя. Куда это поместить?

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

Что-то не так с моими логическими типами претензий?

Ответ 1

Для имени пользователя следует использовать ClaimTypes.Name (http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name).

ClaimTypes.NameIdentifier обычно используется для идентификатора пользователя. В некоторых случаях это может быть имя пользователя.

Идентификатор ASP.NET использует ClaimTypes.Name для хранения имени пользователя и ClaimTypes.NameIdentifier для хранения GUID основного ключа пользователя.

Ответ 2

Если вы изучите, что Facebook или Google вернутся из oAuth, вы увидите, что ClaimTypes.Name является ClaimTypes.GivenName + ClaimTypes.Surname. LinkedIn возвращает тогда конкатенацию, и я считаю, что это ошибка, потому что у меня совершенно другое имя пользователя. Twitter возвращает имя пользователя для ClaimTypes.Name, но Twitter - это особый случай, и они даже не возвращают электронную почту.

Все они используют некоторый непрозрачный числовой идентификатор для ClaimTypes.NameIdentifier. И они используют свои собственные имена строк, обычно начиная с urn:facebook:link, urn:google:profile и т.д. Для пользовательских данных.

Модель Identity Asp.NET использует UserName для ClaimTypes.Name. Суть в том, что ClaimTypes.Name используется по-разному на практике. Вы могли бы добавить любое имя претензии в виде строки и могли бы добавить схему urn:..., чтобы сделать ее однозначной.