未使用 Identity Server 4 持久授权

Identity Sever 4 Persisted Grants not being used

我已经实现了 IPersistedGrantStore,并定义了一个将属性 RequireConsent 和 AllowRememberConsent 设置为 true 的客户端。我还从该客户端删除了离线访问范围,因为我在某处读到如果根据 OAuth 规范请求离线访问范围,则始终强制同意。 当我第一次进入登录屏幕时,我看到同意视图,单击允许并记住我的决定,我可以看到数据库 table PersistedGrants 中的记录正在添加类型 user_consent。下次我尝试登录时,该记录是通过我的 IPersistedGrantStore 实现从数据库中获取的,但同意视图仍然存在。如果我再次单击“允许”,DB 将抛出异常,因为 IS4 正在尝试使用相同的键插入另一个 PersistedGrant 记录。

我是否忽略了某些会使其按预期运行的设置? PS。我已经实现了所有主要商店,所有东西都保存在 SQL 服务器数据库中,不使用任何 InMemory 商店。

经过大量调试后,问题出在这里: _ScopeListItem.cshtml来自6_AspNetIdentity样本,有这段代码

@if (Model.Required)
{
    input type="hidden" name="ScopesConsented" value="@Model.Name" />
}

这显然只有在范围被标记为必需时才会呈现。那些标记为必需的范围只是发布到控制器操作的范围。 在我的例子中,我有一个客户端请求 OpenId 和 Profile 作为标准范围,以及我的 ApiResource 定义的三个范围。诚然,我没有将 Api 范围标记为必需,但问题还在于默认情况下不需要 Profile 范围。 因此,在保存同意时,数据 属性 不包含配置文件范围,并且在随后的所有登录尝试中请求和同意的范围不匹配,这触发了同意过程。