Как извлечь роли пользователей из базы данных при подключении OAUTH для ASP.NET Identity 2.0? - PullRequest
0 голосов
/ 14 января 2019

Я работаю над некоторыми веб-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);

Приведенный выше код является проблемой, поскольку он будет проверять пользователя, но затем назначать КАЖДОМУ пользователю роль администратора в сгенерированном токене!

Буду признателен за любую помощь и спасибо за вашу помощь!

1 Ответ

0 голосов
/ 15 января 2019

Проблема в том, что вы не выставляете претензии по сравнению с ApplicationUserManager, что может сделать для вас большую работу. Кроме того, вы просто настраиваете общий ClaimsIdentity, который, как вы уже указывали, всегда будет возвращать одинаковый набор ролей для всех пользователей.

В GrantResourceOwnerCredentials() вы хотите:

//
// Get an instance of the ApplicationUserManager that you've already registered
// with OWIN
//
var mgr = context.OwinContext.GetUserManager<ApplicationUserManager>();

//
// Have the ApplicationUserManager build your ClaimsIdentity instead
//
var identity = await mgr.CreateIdentityAsync(user, 
                                             context.Options.AuthenticationType);

//
// Then here, you could add other application-specific claims if you wanted to.
...