【问题标题】:.NET Core configure OpenIddict with MongoDb.NET Core 使用 MongoDb 配置 OpenIddict
【发布时间】:2020-11-01 08:41:03
【问题描述】:

对于我的 REST Api,我想使用 OpenIddict 身份验证方案。作为数据库,我使用的是 MongoDb。我已经安装了所有必要的依赖项。所有依赖项都有最新版本。

我现在想在我的 Startup.cs 中注册 OpenIddict。在第一步中做这个(就像在文档中一样)

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

就在options.UseOpenIddict&lt;ObjectId&gt;(); 我得到以下错误:

'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 错误。

我正在使用所有指令。我用谷歌搜索了很多。我发现的唯一一件事是您需要安装所需的软件包,但我安装了它们。 (在我遵循的教程的解决方案文件中是完全相同的)

有人知道怎么解决吗?

【问题讨论】:

  • 如果你使用MongoDB,为什么要调用services.AddDbContext(),这是一个Entity Framework方法? OpenIddict 原生支持 MongoDB:nuget.org/packages/OpenIddict.MongoDb
  • @KévinChalet 谢谢。这有很大帮助。我现在将我的解决方案添加到我的答案中

标签: c# mongodb .net-core openiddict


【解决方案1】:

问题在于覆盖UseOpenIddict 方法的包。我已经卸载了包并重写了一些代码,因为包不是必需的。 This 是不兼容的包。

更新

感谢Kévin Chaletthis comment

我将身份配置改写为

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

这对我来说非常有效。

更新 2

我在 Google 上搜索了更多信息,但没有找到任何关于如何正确实施 OpenIddict 和 MongoDb 的解决方案。对于刚刚开始以下内容的人可能会有所帮助。我的 OpenIddict / 身份验证 / 授权运行良好,配置如下:

Startup.cs

配置服务:

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) { }
}

【讨论】:

  • 我假设您将这个NuGet package 用于AddIdentityMongoDbProvider
  • @MarkMalaban 是的,我是
猜你喜欢
  • 2018-03-24
  • 2022-01-15
  • 2018-04-07
  • 2019-06-15
  • 2017-06-20
  • 2016-08-29
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多