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

Как вы потребляете дополнительные параметры в запросе Token2 Token в приложении .net WebApi2

У меня есть конкретный проект api в большом веб-решении .net MVC 5. Я использую шаблоны WebApi2 из коробки для аутентификации пользователя через api. Используя отдельные учетные записи для аутентификации, орган запроса, необходимый для получения токена доступа,:

grant_type=password&username={someuser}&password={somepassword}

Это работает как ожидалось.

Однако мне нужно добавить 3-мерное измерение к методу подкладок "GrantResourceOwnerCredentials". В дополнение к проверке имени пользователя/пароля мне нужно добавить идентификатор устройства, который предназначен для ограничения доступа с учетной записи пользователя к определенному устройству. Неясно, как добавить эти дополнительные параметры запроса к уже определенному "OAuthGrantResourceOwnerCredentialsContext". Этот контекст в настоящее время оставляет место для UserName и Password, но, очевидно, мне нужно будет добавить больше.

Мой вопрос просто: существует ли стандартный способ расширить требования входа в систему для запроса токена OWuth OAuth2 для включения большего количества данных? И как вы могли бы сделать это в среде .NET WebApi2?

4b9b3361

Ответ 1

Как это часто бывает, я нашел ответ сразу после отправки вопроса...

ApplicationOAuthProvider.cs содержит следующий код из коробки

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (UserManager<IdentityUser> userManager = _userManagerFactory())
    {
        IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
}

Просто добавив

var data = await context.Request.ReadFormAsync();

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

Надеюсь, это поможет кому-то!