Ответ 1
Вы должны добавить метод GrantResourceOwnerCredentials:
identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));
Шаг за шагом
В классе StartUp.cs у вас должен быть пользовательский поставщик, например, строка
Provider = new CustomAuthorizationServerProvider()
например:
public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
Provider = new CustomAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
Затем ваш CustomAuthorizationServerProvider, который наследует класс OAuthAuthorizationServerProvider, переопределит GrantResourceOwnerCredentials (контекст OAuthGrantResourceOwnerCredentialsContext).
Затем, проверив, что пользователь имеет правильное имя пользователя и пароль, вы должны добавить
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
...
// other claims
...
identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));
...
var ticket = new AuthenticationTicket(identity, properties);
context.Validated(ticket);
Edited
Вы можете получить роли пользователя из БД, вместо того, чтобы использовать строку "admins" harcoded:
var roles = await userManager.GetRolesAsync(userId);
Таким образом, вы можете добавить в свой репозиторий следующий метод:
public async Task<IList<string>> UserRoles(string userId)
{
IList<string> roles = await userManager.GetRolesAsync(userId);
return roles;
}
И затем назовите это из вашего переопределенного GrantResourceOwnerCredentials, добавив:
using (AuthRepository repository = new AuthRepository())
{
IdentityUser user = await repository.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect");
return;
}
var roles = repository.UserRoles(user.Id);
}