【问题标题】:Navigate to a website and set claims导航到网站并设置声明
【发布时间】:2016-07-08 19:20:47
【问题描述】:

我需要导航到一个网站并设置一些声明供该网站使用,但我找不到任何关于如何操作的解释。我一定是在谷歌上搜索错误的单词。

我正在使用 c# 和 .Net 框架 4.6.1

编辑 1

我被要求更好地解释我的挑战。我正在开发 2 个独立的网站。用户将始终访问网站 A,在那里他们将使用 Azure B2C 进行身份验证。一旦通过身份验证,他们将执行一些操作,之后他们将被导航到网站 B。Azure B2C 使用声明将用户数据传递到网站 A,我想将其转发到网站 B

【问题讨论】:

  • 请不要在没有解释原因的情况下投反对票!我的问题有什么问题?
  • 我不是反对者 - 请澄清您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask page 以获得澄清此问题的帮助。
  • 我想我问了一个和你类似的问题。这是链接:stackoverflow.com/questions/34690705/…

标签: asp.net asp.net-mvc azure azure-active-directory claims-based-identity


【解决方案1】:

来自网站 A 的声明不会发送到网站 B。

这可以这样工作:

  1. A 用户登录到站点 A(使用来自 B2C 的凭据)
  2. 用户将信息保存到 B2C(使用 Graph API)
  3. 重定向到站点 B
  4. 用户登录到站点 B(这可以在不提示用户的情况下发生,相同的 B2C)
  5. 声明是为站点 B 创建的,但它们可以包含在第 2 步中设置的值

图形 API: https://azure.microsoft.com/en-us/documentation/articles/active-directory-b2c-devquickstarts-graph-dotnet/


如果信息已经在 B2C 目录下,例子就更简单了,创建 2 个站点: https://azure.microsoft.com/nl-nl/documentation/articles/active-directory-b2c-devquickstarts-web-dotnet/

创建一个自定义属性来存储信息: https://azure.microsoft.com/nl-nl/documentation/articles/active-directory-b2c-reference-custom-attr/

  • 创建 B2C 自定义属性:
  • 创建 2(两个)B2C 应用程序
  • 使用自定义属性创建单个 B2C 登录策略并将其添加到声明中
  • 在两个应用程序中使用相同的策略,两者应该看到相同的声明

【讨论】:

  • 谢谢 Erik,你能解释一下你的第一句话吗?为什么不会发送?出于重复和信息安全的原因,我特别不想将 B2C 中已经存在的数据保存在我自己的数据库中。如果 B2C 网站可以通过我的网站声明,为什么我不能转发其中一些?
  • 声明是由安全令牌服务 (STS) 创建的,在这种情况下是 B2C。并且是为每个网站专门制作的,可能包含一个网站的敏感信息。您可以指示第二个网站对已登录的用户进行单点登录,并为站点 B 创建新的声明,因此不需要单独的数据库。所以你的解决方案是对的,但它是通过第二个声明完成的,而不是转发原始的
  • 感谢 Erik,我很乐意制作新的声明。然而,我很难找到如何做到这一点,创建声明并将它们传递给您导航到的网站。您能否指出一些示例代码来说明如何执行此操作?
  • 无需代码,查看编辑后的答案,B2C 为您处理索赔部分
【解决方案2】:

您需要做的是在您的网站 B 中公开一个新的登录操作。此登录操作可以接收一个加密令牌,其中包含您有兴趣转发到站点 B 的声明。收到该加密令牌后,网站 B 可以对其进行解密并重新创建您感兴趣的声明。您可以使用内置的 JwtSecurityToken Handler:

https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytokenhandler(v=vs.114).aspx

例如:

public string CreateSecurityToken(string audience, IEnumerable<Claim> claims)
    {
        if (claims == null) return null;
        var credentials = new SigningCredentials(
                new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("SOMEKEY")),
                "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256",
                "http://www.w3.org/2001/04/xmlenc#sha256");

        var claimsIdentity = new ClaimsIdentity(claims, "Custom Authentication", System.Security.Claims.ClaimTypes.Name, System.Security.Claims.ClaimTypes.Role);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = claimsIdentity,
            TokenIssuerName = TokenIssuer,
            AppliesToAddress = "http://" + audience,
            Lifetime = new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddMinutes(GetTokenExpirationMinutes(audience))),
            SigningCredentials = credentials
        };
        var jwtHandler = new JwtSecurityTokenHandler();
        var token = jwtHandler.CreateToken(tokenDescriptor);
        return jwtHandler.WriteToken(token);
    }

这将创建一个令牌,您可以将其发送到网站 B 上的登录方法

【讨论】:

  • 谢谢 Luis,然后我会调用 Login 方法并执行 Server.Transfer 吗?那会保留登录会话吗?如果这些是菜鸟问题,我深表歉意,它们来自菜鸟:)
  • 您需要在您的其他应用程序上创建一个新会话,并将您的声明编码在您的加密令牌中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多