【问题标题】:Getting Claims from OAuth Authorization Service in ASP.Net MVC 6从 ASP.Net MVC 6 中的 OAuth 授权服务获取声明
【发布时间】:2016-09-27 02:03:10
【问题描述】:

我正在使用以下代码从我的 MVC Web 应用程序中成功获取令牌。但是我不确定如何检索我添加的声明。它们是否应该在与我的令牌相同的响应中返回? 谢谢!

Startup.cs:

    app.UseJwtBearerAuthentication(options =>
    {
        options.AutomaticAuthenticate = true;
        options.Audience = "resource_server";
        options.Authority = "https://www.example.com/";
        options.RequireHttpsMetadata = false;
    });

    app.UseOpenIdConnectServer(options =>
    {
        options.ApplicationCanDisplayErrors = true;
        options.AllowInsecureHttp = false;
        options.Provider = new AuthorizationProvider();
        options.TokenEndpointPath = "/connect/token";
    });

添加声明:

        identity.AddClaim("custom_claim", "value", "token id_token");

        foreach (string role in await userManager.GetRolesAsync(user))
        {
            identity.AddClaim(ClaimTypes.Role, role, "id_token token");
        }

这是我的 PostAsync 结果:

{"resource":"resource_server","scope":"openid profile","token_type":"bearer","access_token":"eyJhbGciOiJSU....","expires_in":"3600"}

【问题讨论】:

  • 你为什么不用User.FindFirst("custom_claim").Value
  • 我的客户端是一个 Xamarin iOS/Android 应用程序,我认为它没有 asp.net 用户对象。我正在进行 oauth 登录,然后将令牌和声明保留在我的应用中。

标签: c# asp.net asp.net-core openid-connect aspnet-contrib


【解决方案1】:

是否应该在与我的令牌相同的响应中返回它们?

由于您同时指定了id_tokentoken 目标,因此您的声明应同时复制到访问令牌和身份令牌中。您应该能够使用任何 JSON 解析器从 access_token/id_token 属性中提取您要查找的声明。

两个备注:

  • 在 ASOS beta4 中,您必须在令牌请求中显式添加 scope=openid 才能取回身份令牌,即使您调用了 ticket.SetScopes("openid"),这可能解释了为什么响应中没有 id_token 属性你分享了。下一版本放宽了此政策。

  • 在 ASOS beta4(针对 ASP.NET Core RC1)中,访问令牌使用 JWT 格式进行序列化。 beta5 版本不再如此,默认情况下使用加密格式。不要尝试从客户端应用程序中读取它们:而是使用 id_token,它应该由客户端应用程序使用。

【讨论】:

  • 非常感谢您提供的信息。我正在反序列化我的响应,如下所示: AuthToken token = JsonConvert.DeserializeObject(result);你是说我应该能够从 token.access_token 中提取声明吗?我还没有看到任何关于如何提取索赔的例子。你有没有机会知道任何例子?再次感谢!!!!
  • 我试过这个: var token = Convert.FromBase64String(json.id_token.split('.')[1]);但我收到此错误:FormatException: Invalid length for a Base-64 char array or string.
  • 通过这样做获得声明: var token = new JwtSecurityToken(token.IdToken); var 声明 = token.Claims;希望这是一个好方法。
  • 它有效,但它不强制执行任何安全检查(例如签名/颁发者/观众验证)。根据您使用的 OAuth2/OpenID Connect 流程,这可能是一个(可怕的)问题。此外,如果您正在开发 ASP.NET (Core) 客户端应用程序,还有更好的方法来实现您想要的(例如使用 OpenID Connect 身份验证中间件)。
猜你喜欢
  • 2015-05-17
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2014-09-05
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多