Возвратите больше информации клиентскому использованию OAuth Bearer Tokens Generation и Owin в WebApi

Я создал WebApi и приложение Cordova. Я использую Запросы HTTP для передачи между приложением Cordova и WebAPI. В WebAPI я реализовал Маркерное Поколение Несущей OAuth.

public void ConfigureOAuth(IAppBuilder app)
    {
        var oAuthServerOptions = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider(new UserService(new Repository<User>(new RabbitApiObjectContext()), new EncryptionService()))
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(oAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    }

и это в SimpleAuthorizationServerProvider реализация

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
       context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        // A little hack. context.UserName contains the email
        var user = await _userService.GetUserByEmailAndPassword(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "Wrong email or password.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user"));

        context.Validated(identity);
    }

после успешного запроса входа в систему к API из приложения Cordova я получаю следующий JSON

{"access_token":"some token","token_type":"bearer","expires_in":86399}

Проблема, что я запрашиваю больше информации о пользователе. Например, у меня есть поле UserGuid в базе данных, и я хочу отправить ее в приложение Cordova, когда вход в систему успешен и использовать ее позже в других запросах. Я могу включать другую информацию для возврата к клиенту, кроме "access_token", "token_type" и "expires_in"? В противном случае, как я могу получить пользователя в API на основе access_token?


Править:

Я думаю, что нашел обходное решение. Я добавил следующий код внутри GrantResourceOwnerCredentials

identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));

и после этого, я получаю доступ к GUID в своем контроллере как это: User.Identity.Name

Я также могу добавить гуид с пользовательским именем identity.AddClaim(new Claim("guid", user.UserGuid.ToString()));

Мне все еще интересно знать, существует ли способ возвратить больше данных клиенту с маркером несущей JSON.

62
задан 6 June 2018 в 16:07

2 ответа

Можно добавить столько требований, сколько Вы хотите.
можно добавить стандартный набор требований от System.Security.Claims или создать собственное.
Требования будут зашифрованы в Вашем маркере, таким образом, к ним только получат доступ с сервера ресурса.

, Если Вы хотите, чтобы Ваш клиент смог считать расширенные свойства Вашего маркера, у Вас есть другая опция: AuthenticationProperties.

Скажем, Вы хотите добавить что-то так, чтобы у Вашего клиента мог быть доступ к. Это - способ пойти:

var props = new AuthenticationProperties(new Dictionary<string, string>
{
    { 
        "surname", "Smith"
    },
    { 
        "age", "20"
    },
    { 
    "gender", "Male"
    }
});

Теперь можно создать тикет со свойствами, которые Вы добавили выше:

var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);

Это - результат, который выберет Ваш клиент:

.expires: "Tue, 14 Oct 2014 20:42:52 GMT"
.issued: "Tue, 14 Oct 2014 20:12:52 GMT"
access_token: "blahblahblah"
expires_in: 1799
age: "20"
gender: "Male"
surname: "Smith"
token_type: "bearer"

, С другой стороны, если Вы добавляете требования, Вы сможете считать их в своем сервере ресурса в Вашем контроллере API:

public IHttpActionResult Get()
{
    ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

    return Ok();
}

Ваш ClaimsPrincipal будет содержать Ваше новое заявление guid, которое Вы добавили здесь:

identity.AddClaim(new Claim("guid", user.UserGuid.ToString()));

, Если Вы хотите знать больше о должном, маркерах несущей и веб-API, там действительно хорошее учебное руководство здесь и этот , статья поможет Вам схватить все понятия позади Сервер Ресурса Сервера авторизации и .

ОБНОВЛЕНИЕ :

можно найти рабочий пример здесь . Это сеть Api + саморазмещенный Owin.
нет никакой базы данных, включенной здесь. Клиент является консольным приложением (существует HTML + образец JavaScript также), которые называют веб-API передающими учетными данными.

Как предложенный Taiseer, необходимо переопределить TokenEndpoint:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
    {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
    }

    return Task.FromResult<object>(null);
}

Включают 'Несколько Проектов Запуска' из Решения-> Свойства, и можно немедленно выполнить его.

91
ответ дан 31 October 2019 в 13:42

Моя рекомендация не состоит в том, чтобы добавить дополнительные требования маркера, если не нужный, потому что увеличит размер маркера, и Вы будете продолжать отправлять его с каждым запросом. Поскольку рекомендуемые LeftyX добавляют их как свойства, но удостоверяются, что Вы переопределяете TokenEndPoint метод для получения тех свойств как ответа при получении маркера успешно без этой конечной точки, свойства не возвратятся в ответе.

 public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
        foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
        {
            context.AdditionalResponseParameters.Add(property.Key, property.Value);
        }

        return Task.FromResult<object>(null);
    }

можно проверить мой repo здесь для полного примера. Надежда это поможет.

44
ответ дан 31 October 2019 в 13:42

Другие вопросы по тегам:

Похожие вопросы: