Я работаю над некоторыми веб-API, и мне было поручено добавить авторизацию на основе ролей для некоторых конечных точек с помощью ASP.NET Identity 2.0.
Я создал административную структуру на основе API для управления пользователями и ролями и столкнулся с камнем преткновения при попытке реализовать авторизацию / аутентификацию с использованием маркеров OAUTH Bearer.
(ПРИМЕЧАНИЕ. Я читал, что JWT лучше использовать и упрощает предоставление пользовательских данных, но спрос на ванильный OAUTH)
Итак, что касается кода, это то, что я имею до сих пор, включая точку преткновения:
Startup.cs:
private static void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
// Configure the db context, user manager and role manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
// Create the options for the token authorization
var oauthAuthorizationServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oauthAuthorizationServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
SimpleAuthorizationServerProvider.cs:
public sealed class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
// We are not validating clients at this point, simply "resource owners" i.e. user / pass combos
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
using (var repo = new AuthorizationRepository())
{
var user = repo.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}
// How do you pull the user data (including roles) from the database here, and place into a claim for API consumption??
}
}
В Интернете я обнаружил следующее, но это только создает роль по умолчанию для пользователя (или списка ролей):
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, "admin"));
identity.AddClaim(new Claim("sub", context.UserName));
context.Validated(identity);
Приведенный выше код является проблемой, поскольку он будет проверять пользователя, но затем назначать КАЖДОМУ пользователю роль администратора в сгенерированном токене!
Буду признателен за любую помощь и спасибо за вашу помощь!