. NET Базовая настройка OpenIddict с MongoDb - PullRequest
0 голосов
/ 11 июля 2020

Для моего REST Api я хочу использовать схему аутентификации OpenIddict. В качестве базы данных я использую MongoDb. Я установил все необходимые зависимости. Все зависимости имеют самую новую версию.

В моем Startup.cs я хочу зарегистрировать OpenIddict сейчас. На первом шаге сделайте это (как в документации)

services.AddDbContext<UserDbContext>(options =>
{
    options.UseOpenIddict<ObjectId>();
});

Прямо на options.UseOpenIddict<ObjectId>(); Я получаю следующую ошибку:

'DbContextOptionsBuilder' does not contain a definition for 'UseOpenIddict' and no accessible extension method 'UseOpenIddict' accepting a first argument of type 'DbContextOptionsBuilder' could be found(are you missing a using directive or an assembly reference?)

Это ошибка CS1061.

Я использую все директивы. Я много гуглил. Единственное, что я обнаружил, это то, что вам нужно установить необходимые пакеты, но я их установил. (В файлах решений учебного пособия, которое я использую, точно такие же)

Кто-нибудь знает, как это решить?

1 Ответ

1 голос
/ 12 июля 2020

Проблема была в пакете, который перекрыл метод UseOpenIddict. Я удалил пакет и переписал код, так как в пакете не было необходимости. Этот является несовместимым пакетом.

Обновление

Спасибо Kévin Chalet за этот комментарий .

Я переписал свою конфигурацию удостоверения на

services.AddIdentityMongoDbProvider<UserEntity, UserRoleEntity>(mongo =>
{
    mongo.ConnectionString = _databaseUri;
});

Теперь это отлично работает для меня.

Обновление 2

Я погуглил еще, и у меня нет не нашел решений, как правильно реализовать OpenIddict и MongoDb. Для тех, кто только начинает, может помочь следующее. Мой OpenIddict / аутентификация / авторизация работает нормально со следующей конфигурацией:

Startup.cs

ConfigureServices:

services.AddIdentityMongoDbProvider<UserEntity, UserRoleEntity>(mongo = >{
    mongo.ConnectionString = _databaseUri;
});

services.Configure<IdentityOptions>(options = >{
    options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name;
    options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
    options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;
});

services.AddAuthentication(options = >{
    options.DefaultScheme = OpenIddictValidationDefaults.AuthenticationScheme;
});

services
    .AddOpenIddict()
    .AddCore(options = >{
        options.UseMongoDb()
            .UseDatabase(new MongoClient(_databaseUri)
            .GetDatabase(_database));
    }).AddServer(options = >{
        options.SetAccessTokenLifetime(TimeSpan.FromDays(5));
    
        options.UseMvc();
    
        options.EnableTokenEndpoint("/api/token");
    
        options.EnableUserinfoEndpoint("/api/userinfo");
    
        options.AllowPasswordFlow()
            .AllowRefreshTokenFlow();
    
        options.AcceptAnonymousClients();
    }).AddValidation();

services.AddAuthorization(options = >{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(OpenIddictValidationDefaults.AuthenticationScheme)
                .RequireAuthenticatedUser()
                .Build();
});

Настроить:

app.UseAuthentication();

app.UseCors("AllowBrowserApp");

app.UseRouting();

app.UseAuthorization();

Примечание. Важно, где вы регистрируете аутентификацию и авторизацию. Аутентификация происходит до app.UseRouting(), а авторизация - после этого. Иначе не получится. Если вы используете Visual Studio, он покажет вам.

UserEntity.cs

public class UserEntity : MongoUser
{
    public string Firstname { get; set; }

    public string Lastname { get; set; }
}

Вы можете добавить дополнительные свойства, если хотите.

UserRoleEntity.cs

public class UserRoleEntity : MongoRole
{
    public UserRoleEntity() : base() { }

    public UserRoleEntity(string roleName) : base(roleName) { }
}
...