首页 > 解决方案 > access_token / id_token 没有角色信息,可以在令牌中添加其他信息而不是检查每个页面吗?

问题描述

我有一个带有 API(网络核心)的 React 项目。我的网站菜单/字段将根据Role用户的显示/隐藏。用户将通过外部 oidc 登录我的网站。

但是,access_token来自id_tokenoidc 的 and 没有Role信息,它只有它们的email,我将使用它们来检查我的数据库以确定哪个Role是登录用户。目前我有一个Role基于他们的API access_token,所以它就像

public string getRoles(string access_token)
{
    //check Database
    return role;
}  

几乎每个页面都会调用这个函数,所以我想知道有没有更有效的方法来做到这一点?

标签: c#reactjsasp.net-coreasp.net-web-api

解决方案


当使用数据库中的角色确认登录时,您需要将声明添加到 HttpContext.User 。当您在启动时定义此连接时,请务必处理 OnTokenValidated 事件。

.AddOpenIdConnect("oidc", options =>
{
    options.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = async ctx =>
        {
            var claim = new Claim("Role", "TheirRole");

            var identity = new ClaimsIdentity(new[] { claim });

            ctx.Principal.AddIdentity(identity);

            await Task.CompletedTask;
        }
    };
}

然后你可以像这样在控制器(或任何有 HttpContext 的地方)中访问它

var claim = HttpContext.User.Claims.First(c => c.Role == "TheirRole");

推荐阅读