【问题标题】:SecurityTokenValidated Identity gets lostSecurityTokenValidated 身份丢失
【发布时间】:2016-07-19 01:58:31
【问题描述】:

我正在尝试在 SecurityTokenValidated 事件中获取访问令牌,并在获得访问令牌后将其保存在声明中。问题是当我尝试访问该声明时,它不再存在。

SecurityTokenValidated 代码是这样的:

  public static async Task<Task> SecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
    {
        string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        string clientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"];
        string source = ConfigurationManager.AppSettings["ExchangeOnlineId"];

        var authContext = new AuthenticationContext(aadInstance, false);
        var credentials = new ClientCredential(clientId, clientSecret);
        var appRedirectUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + "/";
        var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code, new Uri(appRedirectUrl), credentials, source);
        var accessToken = authResult.AccessToken;
        var applicationUserIdentity = new ClaimsIdentity(context.OwinContext.Authentication.User.Identity);
        applicationUserIdentity.AddClaim(new Claim("AccessToken", accessToken));
        context.OwinContext.Authentication.User.AddIdentity(applicationUserIdentity);
        return Task.FromResult(0);
    }

我尝试像这样访问它:

var accessToken =((ClaimsPrincipal)HttpContext.Current.User).FindFirst("AccessToken").Value;

更新: 事实证明,我们有一些覆盖 HttpContext.Current.User 的代码。我对该代码进行了一些更改,如下所示:

 var claims = ((ClaimsPrincipal)HttpContext.Current.User).Claims;
            var newPrincipal = new GenericPrincipal(new GenericIdentity(domainUserName), null);
            ((ClaimsIdentity)newPrincipal.Identity).AddClaims(claims);
            HttpContext.Current.User = newPrincipal;

但没有运气。我可以很好地获得声明,但我在 newPrincipal 上看不到它们...

【问题讨论】:

    标签: oauth-2.0 owin azure-active-directory


    【解决方案1】:

    看来问题在于我是如何访问它们的。这不起作用:

    var accessToken =((ClaimsPrincipal)HttpContext.Current.User).FindFirst("AccessToken").Value;
    

    虽然这样做:

    var accessToken =((ClaimsIdentity)HttpContext.Current.User.Identity).FindFirst("AccessToken").Value;
    

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2010-12-07
      • 2018-09-06
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多