Возврат дополнительной информации клиенту с помощью генерации токенов OAuth Bearer и 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
?
EDIT:
Я думаю, что нашел обходной путь.
Я добавил следующий код внутри GrantResourceOwnerCredentials
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));
и после этого я получаю доступ к GUID внутри моего контроллера следующим образом:User.Identity.Name
Я также могу добавить guid с пользовательским именем identity.AddClaim(new Claim("guid", user.UserGuid.ToString()));
мне все еще интересно узнать, есть ли способ вернуть больше данных клиенту с токеном носителя JSON.
2 ответов
вы можете добавить столько претензий, сколько хотите.
Вы можете добавить стандартный набор утверждений из System.Security.Claims
или создать свой собственный.
Утверждения будут зашифрованы в вашем токене, поэтому они будут доступны только с сервера ресурсов.
если вы хотите, чтобы ваш клиент мог читать расширенные свойства вашего токена, у вас есть другой вариант:AuthenticationProperties
.
предположим, вы хотите добавить что-то, чтобы ваш клиент мог иметь доступ. Вот так go:
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()));
если вы хотите узнать больше о owin, предъявитель токены и веб-api есть действительно хороший учебник здесь и статьи поможет вам понять все концепции Сервер Авторизации и Ресурсов Сервера.
обновление:
вы можете найти рабочий пример здесь. Это Web Api + долг self-hosted.
Здесь нет базы данных.
Клиент консоли приложение (есть также пример 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);
}
включить "несколько проектов запуска" из решения -> свойства, и вы можете запустить его сразу.
моя рекомендация не добавлять дополнительные претензии к токену, если это не нужно, потому что увеличит размер токена, и вы будете продолжать отправлять его с каждым запросом.
Как 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);
}
Вы можете проверить мой РЕПО здесь для полного образец. Надеюсь, это поможет.