Я хочу реализовать свою собственную аутентификацию по WebApi. Я пытаюсь изменить метод GrantResourceOwnerCredentials в ApplicationOAuthProvider.
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(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
}
Я заменяю аутентификацию:
IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);
с моим вызовом веб-службы, который возвращает true для аутентификации и false для не аутентифицированного.
if (authenticated)
{
IdentityUser user = new IdentityUser("username");
}
Но я не знаю, как действовать с ClaimsIdentity. У кого есть образцы, на которые я могу ссылаться? Благодарю.
В конце этого, но может также документировать его, поскольку он все еще имеет значение. Если вы имеете в виду, как вы назначаете и разрешаете претензии из билета, у вас есть варианты. Вы можете либо реализовать IUserClaimsStore (документацию для указанного объекта), либо просто создать свою собственную службу хранения заявок. Самый ручной метод заключается в том, чтобы приписывать претензии пользователю явно после проверки их входа и получения их личности. Вот простой пример использования вашего кода:
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;
}
user.AddClaim(new Claim("sub","whateveryouwantthesubjectnametobe"));
user.AddClaim(new Claim("someotherclaim","whosecontentsyoudeterminehoweveryouwouldlike"));
ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
context.Options.AuthenticationType);
ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
CookieAuthenticationDefaults.AuthenticationType);
AuthenticationProperties properties = CreateProperties(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
Должно быть, претензии будут частью вашего токена, и он должен автоматически заполнить ClaimsPrincipal при следующем запросе. Если вы хотите просмотреть десериализацию билета по запросу, создайте простую реализацию OAuthBearerAuthenticationProvider и переопределите метод ValidateIdentity:
private class SuperSecretBearerAuthClass: OAuthBearerAuthenticationProvider
{
public override Task ValidateIdentity(OAuthValidateIdentityContext context)
{
var claims = context.Ticket.Identity.Claims; //examine claims here
base.ValidateIdentity(context);
return Task.FromResult<object>(null);
}
}
Регистрация в startup.cs/везде, где вы настраиваете свой auth, будет выглядеть так:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new SuperSecretBearerAuthClass()
});
Я действительно не понимаю, что вы ищете, но вы можете взглянуть на реализацию Thinktectures встроенного сервера OAuth.
Проверьте проект Thinktecture.IdentityModel и образцы - https://github.com/thinktecture/Thinktecture.IdentityModel
У них есть пример проекта под названием samples\OAuth2\EmbeddedAuthorizationServer, который использует метод GrantResourceOwnerCredentials для аутентификации.
Здесь есть простая запись в блоге ClaimsIdentity, которая также может помочь. http://www.remondo.net/simple-claims-based-identity/