当前位置: 首页 > 知识库问答 >
问题:

如何验证ASP.NET mvc OWIN从azure AD B2C接收到的id_token

阴永福
2023-03-14
return new OpenIdConnectAuthenticationOptions
            {
                ...
                Notifications = new OpenIdConnectAuthenticationNotifications //Specifies events which the OpenIdConnectAuthenticationMiddleware invokes to enable developer control over the authentication process.
                {
                    AuthenticationFailed = this.AuthenticationFailed,
                    RedirectToIdentityProvider = this.RedirectToIdentityProvider,
                    AuthorizationCodeReceived = this.OnAuthorizationCodeReceived,
                },

                TokenValidationParameters = new TokenValidationParameters
                {
                    SaveSigninToken = true,           // Important to save the token in boostrapcontext
                    ValidateAudience = true,          // Validate the Audience
                    ValidateIssuer = true,            // Validate the Issuer
                    ValidateLifetime = true,          // Validate the tokens lifetime
                    ValidIssuer = Issuer,             // The issuer to be validated
                    ValidAudience = ClientId,          // The Audience to be validated
                },
            };

共有1个答案

訾俊名
2023-03-14

让你的问题更简单。

token背后的想法是解析token,并从token中获得3个部分

-Header : contain information about in which algorithm the token haven been encrypted

-Payload : information about the user

-Signature: it's the calculation of encryption of ( Header + Payload) using the Azure certificate or( your identity provider).

下一步,用户将请求与JWT一起发送到后端。

.AddOpenIdConnect(o =>
    {
        //Additional config snipped
        o.Events = new OpenIdConnectEvents
        {
            OnTokenValidated = async ctx =>
            {
                //Get user's immutable object id from claims that came from Azure AD
                string oid = ctx.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");

                //Get EF context
                var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>();

                //Check is user a super admin
                bool isSuperAdmin = await db.SuperAdmins.AnyAsync(a => a.ObjectId == oid);
                if (isSuperAdmin)
                {
                    //Add claim if they are
                    var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Role, "superadmin")
                    };
                    var appIdentity = new ClaimsIdentity(claims);

                    ctx.Principal.AddIdentity(appIdentity);
                }
            }
        };
});
function parseJwt (token) {
            var base64Url = token.split('.')[1];
            var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
            return JSON.parse(window.atob(base64));
};

使用此libary https://www.jsonwebtoken.io/

try {
  string jsonPayload = JWT.JsonWebToken.Decode(token, secretKey);
  Console.WriteLine(jsonPayload);
} catch (JWT.SignatureVerificationException) {
  Console.WriteLine("Invalid token!");
}

或手动

var jwtHandler = new JwtSecurityTokenHandler();
var jwtInput = txtJwtIn.Text;

//Check if readable token (string is in a JWT format)
var readableToken = jwtHandler.CanReadToken(jwtInput);

if(readableToken != true)
{
  txtJwtOut.Text = "The token doesn't seem to be in a proper JWT format.";
}
if(readableToken == true)
{
  var token = jwtHandler.ReadJwtToken(jwtInput);

  //Extract the headers of the JWT
  var headers = token.Header;
  var jwtHeader = "{";
  foreach(var h in headers)
  {
    jwtHeader += '"' + h.Key + "\":\"" + h.Value + "\",";
  }
  jwtHeader += "}";
  txtJwtOut.Text = "Header:\r\n" + JToken.Parse(jwtHeader).ToString(Formatting.Indented);

  //Extract the payload of the JWT
  var claims = token.Claims;
  var jwtPayload = "{";
  foreach(Claim c in claims)
  {
    jwtPayload += '"' + c.Type + "\":\"" + c.Value + "\",";
  }
  jwtPayload += "}";
  txtJwtOut.Text += "\r\nPayload:\r\n" + JToken.Parse(jwtPayload).ToString(Formatting.Indented);  
}

我希望能回答你的问题

 类似资料:
  • 问题内容: 从Java验证HTML的快速简便的方法是什么?我正在寻找一个开放源代码/ PD类(或类集),该类描述了100多种HTML标签的各种属性,例如: 标签是可选的吗?空吗 省略结束标签是否合法? 此标签可以包含哪些其他标签(如果有)? 哪些属性适用于此标签,它们的类型是什么?(不是必需的,但是很高兴) 谢谢! 编辑 我希望对HTML文档进行逐标签分析,因此我对文档整体是否有效不感兴趣,而对每

  • 问题内容: 我正在尝试通过Android的GET发送 (从导入 ),并在收到响应后引发 IOException : 在doRequestInternal()中:“收到的身份验证质询为空” 该错误是什么意思,是什么引起的?我正在将OAuth参数写入到Authorization标头中,但是我在其他场合也可以这样做,没有问题。 问题答案: 我找出原因了。 首先,对于所有不知道此错误意味着什么的人(我肯定

  • 我已经设置了一个电报网络钩子使用node.js/express: 当我获取时,我可以收到我的机器人控制台: 现在我想从机器人程序接收数据,这样当用户访问时https://telegram.me/mybot?start=xyz并按bot,bot应该在的帖子中收到 以下是我收到邮件的路线: 但当用户访问时,我发现机器人中什么也没有发生https://telegram.me/mybot?start=xy

  • 我正在整合Sinch短信验证API在我的应用程序和一半的部分已经完成。到目前为止,我能够发送和生成给定移动号码的OTP请求/响应,并在该移动号码上接收。但是,当我试图验证接收到的OTP错误时,回调会被激发。

  • 我正在做jndi查找JBOSS AS. Code中配置的数据源,如下所示。 initialContext=新的initialContext(道具); dataSource=(dataSource)initialContext。查找(bundle.getString(“jndiName”); ource.get连接; 这段代码放在servlet的doPost中。我也很安全地打电话给你 联系关闭()

  • 我对编码有点陌生,我正在制造一个不和谐的机器人。JSV12,我想知道如何为加入服务器的新用户添加验证。而不是向他们发送他们必须完成的验证码,或者只是添加一个他们点击的反应角色,它会给他们x角色,如“成员”或“已验证”提前感谢:D