为了账号安全,请及时绑定邮箱和手机立即绑定

AspNet 用户声明失踪

AspNet 用户声明失踪

C#
皈依舞 2023-08-20 11:01:31
研究身份提供者的概念证明并需要帮助理解 aspnet 身份的一些细微差别,特别是与用户声明相关的细微差别。我正在努力实现的目标:1) 公开一个 MVC 应用程序,该应用程序提供对将公开体育和运动员数据的 2 个微服务之一的安全访问。2) 允许本地用户帐户和外部帐户(例如 google 或 facebook auth)。当前设置:1) 利用 Identity Server 4 进行身份验证的 Asp.Net MVC 应用程序。2) 两个 Web Api 2 Web 服务(1 个用于体育运动,1 个用于运动员)。Sports API 不安全...即...开放 API。不过,运动员 API 应通过基于策略的授权来保护。3) Identity Server 4 Web 应用程序,通过 IdentityServer4 nuget 包利用实体框架和 ASP.NET Identity。4) SQL Server 数据库“完全”配置为 api 资源、身份资源、客户端、几个具有不同角色和声明的测试用户进行测试。目前有效的方法:1)所有用户都可以登录(本地和谷歌)2) 声明似乎正在按我的预期加载(仍在努力理解 Identity Server 数据模型中声明表的所有关系)。3) MVC 应用程序显示 id_token、access_token、refresh_token,然后循环遍历用户的声明并显示这些内容。什么不起作用:1) 并非所有我认为应该在 mvc 应用程序中显示的声明都实际显示。我的意思的例子:1) 在下面的第一个屏幕截图中,您可以看到给定的名称和家庭名称作为用户“bob”的声明。这是在 MVC razor 中使用以下代码片段显示的:@if (User.Identities.First().IsAuthenticated){    <h1>Tokens:</h1>    <dt>id token</dt>    <dd>@await ViewContext.HttpContext.GetTokenAsync("id_token")</dd>    <dt>access token</dt>    <dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd>    <dt>refresh token</dt>    <dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd>    <br />    <h1>Claims:</h1>    <dl>        @foreach (var claim in User.Claims)        {            <dt>@claim.Type : @claim.Value</dt>        }    </dl>}2) 在第二个屏幕截图中,您可以看到身份服务器生成的访问令牌中包含的其他“声明”。例如,“权限”、“测试”、“角色”、“testingroleclaim”和“oddball”。除了一些地方之外,大部分代码都直接来自 Identity Server 4 文档的快速入门教程。根据我读到的所有内容,为了包含自定义声明,您需要实现自己的 IProfileService 接口实例。我已经这样做了,它似乎按预期工作。以下是代码和屏幕截图,显示调试器中加载的“其他”声明:
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

客户端应用程序负责在连接 openid 中间件时设置 OpenIdConnect 选项。选项对象的属性之一称为“ClaimActions”。这些声明操作允许客户端连接自定义映射属性。

以下是我添加到客户端启动类中的代码,以使该代码适用于一组自动序列化的声明。

services.AddAuthentication(options =>

{

   options.DefaultScheme = "Cookies";

   options.DefaultChallengeScheme = "oidc";

})

.AddCookie("Cookies")

.AddOpenIdConnect("oidc", options =>

{                    

    options.SignInScheme = "Cookies";


    options.Authority = "http://localhost:5000";

    options.RequireHttpsMetadata = false;


    options.ClientId = "mvc";

    options.ClientSecret = "secret";

    options.ResponseType = "code id_token";


    options.SaveTokens = true;

    options.GetClaimsFromUserInfoEndpoint = true;


    options.Scope.Add("athlete.full");

    options.Scope.Add("rights");

    options.Scope.Add("email");

    options.Scope.Add("address");

    options.Scope.Add("phone");


    options.Scope.Add("offline_access");


    // These are what allowed the claims to be serialized for front-end consumption.

    options.ClaimActions.MapJsonKey(JwtClaimTypes.WebSite, "website");

    options.ClaimActions.MapJsonKey(JwtClaimTypes.Gender, "gender");

    options.ClaimActions.MapJsonKey(JwtClaimTypes.BirthDate, "birthdate");

});


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信