Я создал 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.
Можно добавить столько требований, сколько Вы хотите.
можно добавить стандартный набор требований от 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);
}
Включают 'Несколько Проектов Запуска' из Решения-> Свойства, и можно немедленно выполнить его.
Моя рекомендация не состоит в том, чтобы добавить дополнительные требования маркера, если не нужный, потому что увеличит размер маркера, и Вы будете продолжать отправлять его с каждым запросом. Поскольку рекомендуемые 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 здесь для полного примера. Надежда это поможет.