Токен на предъявителя: какой тип ClaimsIdentity должен использоваться в GrantResourceOwnerCredentials?
Это мой сценарий:
Я создаю приложение ASP Net MVC, которое взаимодействует с WebApi. Иногда мне нужен WebApiClient для получения данных с контроллеров WebApi. Чтобы авторизовать мой WebApiClient с использованием учетных данных текущего зарегистрированного пользователя, я хочу использовать токены доступа с OAuth2.
Моя идея состояла в том, чтобы сгенерировать токен при входе в систему и добавить сгенерированный токен в Заявку. Для этого в AccountController:
Login(LoginViewModel model){
[...]
var signinm = HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
var ident = signinm.CreateUserIdentity(user);
//Generate token
BearerToken token = await (new TokenApi()).GetToken(model.UserName, model.Password);
//Store generated token in a claim
ident.AddClaim(new Claim(WebApiClient.API_TOKEN_KEY,
Newtonsoft.Json.JsonConvert.SerializeObject(token)));
[…]
//Finally sign in
HttpContext.GetOwinContext().Authentication.SignIn(authProp, ident);
}
Мои основные вопросы касаются метода GrantResourceOwnerCredentials в ApplicationOAuthProvider:
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
[...]
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity identity = await userManager.CreateIdentityAsync(
user,
DefaultAuthenticationTypes.ExternalBearer);
AuthenticationProperties properties = CreateProperties(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(identity, properties);
context.Validated(ticket);
}
[...]
}
- Должен ли я генерировать это утверждение, и с каким типом DefaultAuthenticationTypes: Cookie или ExternalBearer? Оба, кажется, работают.
- Так как HttpContext.GetOwinContext().Authentication.SignIn(...) уже выполнен при входе в систему, нет необходимости входить в систему также в GrantResourceOwnerCredentials, я не прав?
Спасибо за помощь.