问题在于覆盖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) { }
}