Untuk REST Api saya, saya ingin menggunakan skema otentikasi OpenIddict. Sebagai database saya menggunakan MongoDb. Saya telah menginstal semua dependensi yang diperlukan. Semua dependensi memiliki versi terbaru.

Di Startup.cs saya, saya ingin mendaftar OpenIddict sekarang. Pada langkah pertama buat ini (seperti di dokumentasi)

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

Tepat di options.UseOpenIddict<ObjectId>(); saya mendapatkan kesalahan berikut:

'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?)

Ini adalah kesalahan CS1061.

Saya menggunakan semua arahan. Saya sudah banyak googling. Satu-satunya hal yang saya temukan adalah Anda perlu menginstal paket yang diperlukan, tetapi saya menginstalnya. (Dalam file solusi dari tutorial yang saya ikuti adalah yang sama persis)

Apakah ada yang tahu bagaimana mengatasi ini?

1
Gion Rubitschung 11 Juli 2020, 23:10

1 menjawab

Jawaban Terbaik

Masalahnya adalah dengan paket yang menggantikan metode UseOpenIddict. Saya telah menghapus paket dan menulis ulang beberapa kode, karena paket itu tidak terlalu diperlukan. Ini adalah paket yang tidak tidak kompatibel.

Memperbarui

Terima kasih Kévin Chalet untuk komentar ini.

Saya menulis ulang konfigurasi identitas saya menjadi

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

Ini bekerja sekarang dengan sempurna untuk saya.

Perbarui 2

Saya telah mencari di Google lagi dan saya belum menemukan solusi tentang cara mengimplementasikan OpenIddict dan MongoDb dengan benar. Untuk seseorang yang baru memulai berikut ini mungkin bisa membantu. OpenIddict/otentikasi/otorisasi saya berjalan dengan baik dengan konfigurasi berikut:

Startup.cs

Konfigurasikan Layanan:

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();
});

Konfigurasikan:

app.UseAuthentication();

app.UseCors("AllowBrowserApp");

app.UseRouting();

app.UseAuthorization();

Catatan: Penting di mana Anda mendaftarkan otentikasi dan otorisasi. Otentikasi datang sebelum app.UseRouting() dan otorisasi setelah itu. Kalau tidak, itu tidak akan berhasil. Jika Anda menggunakan Visual Studio itu akan menunjukkan kepada Anda.

UserEntity.cs

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

    public string Lastname { get; set; }
}

Anda dapat menambahkan lebih banyak properti jika Anda mau.

UserRoleEntity.cs

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

    public UserRoleEntity(string roleName) : base(roleName) { }
}
2
despa migros 15 Juli 2020, 19:13