Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 从控制器启动期间获得的存储和访问值_Asp.net Core_Openid Connect - Fatal编程技术网

Asp.net core 从控制器启动期间获得的存储和访问值

Asp.net core 从控制器启动期间获得的存储和访问值,asp.net-core,openid-connect,Asp.net Core,Openid Connect,我正在使用OpenConnect中间件与第三方oidc提供商进行身份验证,一切都按照我的预期启动并运行。在令牌交换期间,我将身份验证代码交换为成功的访问令牌,但随后我需要存储此承载令牌,以便稍后在后续请求中使用。令牌交换作为asp.net核心项目中启动类的一部分完成(通过在OnAuthorizationCodeReceived方法期间重写OpenIdConnectEvents),我需要在控制器中存储和访问该令牌 由于还没有“会话”本身,从startup类存储此令牌值并使其在我的控制器中可访问的最

我正在使用OpenConnect中间件与第三方oidc提供商进行身份验证,一切都按照我的预期启动并运行。在令牌交换期间,我将身份验证代码交换为成功的访问令牌,但随后我需要存储此承载令牌,以便稍后在后续请求中使用。令牌交换作为asp.net核心项目中启动类的一部分完成(通过在
OnAuthorizationCodeReceived
方法期间重写
OpenIdConnectEvents
),我需要在控制器中存储和访问该令牌

由于还没有“会话”本身,从startup类存储此令牌值并使其在我的控制器中可访问的最有效(或建议的方式)是什么

我尝试使用IMemoryCache,但尽管在启动阶段将值放入缓存,但当我尝试在控制器中访问该缓存时,它始终为空

是否有更好的/首选的方法来保存startup类中的值,以供以后在生命周期中使用


我可以在
HttpContext.Authentication.HttpAuthenticationFeature.Handler.Options
中查看oidc的所有
OpenIdConnectOptions
属性和设置,但在令牌交换后,我看不到存储的实际令牌值。

我对Auth0和JWT使用类似的方法。我在索赔服务器上存储一些app_元数据,检索并在控制器中为每个请求使用这些值

Startup.cs配置

var options = new JwtBearerOptions
        {
            Audience = AppSettings.Auth0ClientID,
            Authority = AppSettings.Auth0Domain
        };

        app.UseJwtBearerAuthentication(options);
        app.UseClaimsTransformation(new ClaimsTransformationOptions
        {
            Transformer = new Auth0ClaimsTransformer()
        });
AdminClaimType

public abstract class AdminClaimType : Enumeration
{
    public static readonly AdminClaimType AccountId = new AccountIdType();
    public static readonly AdminClaimType ClientId = new ClientIdType();
    public static readonly AdminClaimType IsActive = new IsActiveType();

    private AdminClaimType(int value, string displayName) : base(value, displayName)
    {

    }

    public abstract string Auth0Key { get; }
    public abstract string DefaultValue { get; }

    private class AccountIdType : AdminClaimType
    {
        public AccountIdType() : base(1, "AccountId")
        {             
        }

        public override string Auth0Key => "accountId";
        public override string DefaultValue => "0";
    }

    private class ClientIdType : AdminClaimType
    {
        public ClientIdType() : base(2, "ClientId")
        {
        }

        public override string Auth0Key => "clientId";
        public override string DefaultValue => "0";
    }

    private class IsActiveType : AdminClaimType
    {
        public IsActiveType() : base(3, "IsActive")
        {
        }

        public override string Auth0Key => "isActive";
        public override string DefaultValue => "false";
    }
}
Auth0ClaimsTransformer

public class Auth0ClaimsTransformer : IClaimsTransformer
{

    private string _accountId = AdminClaimType.AccountId.DefaultValue;
    private string _clientId = AdminClaimType.ClientId.DefaultValue;
    private string _isActive = AdminClaimType.IsActive.DefaultValue;

    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
    {
        //TODO: Clean up and simplify AdminClaimTypes Transformer
        foreach (var claim in context.Principal.Claims)
        {
            switch (claim.Type)
            {
                case "accountId":
                    _accountId = claim.Value ?? _accountId;
                    break;
                case "clientId":
                    _clientId = claim.Value ?? _clientId;
                    break;
                case "isActive":
                    _isActive = claim.Value ?? _isActive;
                    break;
            }
        }
        ((ClaimsIdentity)context.Principal.Identity)
            .AddClaims(new Claim[]
            {
                new Claim(AdminClaimType.AccountId.DisplayName, _accountId),
                new Claim(AdminClaimType.ClientId.DisplayName, _clientId), 
                new Claim(AdminClaimType.IsActive.DisplayName, _isActive)
            });

        return Task.FromResult(context.Principal);
    }
现在,在从BaseAdminController继承的控制器类中,我可以访问:

  • 帐户ID
  • 客户
  • 活跃的
  • Auth0UserId
  • 还有什么我想补充的吗

希望这能有所帮助。

所以我想出来了。它可通过AuthenticationManager在HttpContext上获得:

var idToken = ((AuthenticateInfo)HttpContext.Authentication.GetAuthenticateInfoAsync("Cookies").Result).Properties.Items[".Token.id_token"];

我认为openid中间件应该为您设置ClaimsPrinciple,通过暴露于从控制器基类继承的任何内容的用户对象可以访问该ClaimsPrinciple。我想这可能已经满足了您的需要。@stevejgordon:我可以访问HttpContext.User上的ClaimsPrinciple。用户,是的,但这并不能让我访问asp.net core中的承载令牌值-至少从Intellisense上看是这样。我可以访问声明,但不能访问令牌数据本身?我可以在HttpContext.Authentication.HttpAuthenticationFeature.Handler.Options中看到我可以访问oidc的所有OpenIdConnectOptions属性和设置,但在任何地方都看不到我在令牌交换后存储的实际令牌值。谢谢@trevorc。我想我的问题是,当我在startup.cs中进行令牌交换时,我以字符串的形式获取原始承载令牌值,我对其进行解析并在AuthorizationCodeReceivedContext上进行设置,但需要稍后从控制器访问此原始数据。。。。。。。。。。。。。。。。。。。。。。。。公共静态异步任务AuthorizationCodeReceivedContext(AuthorizationCodeReceivedContext ctx){var tk=doTokenNexChangeHere和ReturnanOpenedConnectionMessageObject()ctx.TokenEndpointResponse=tk;等待任务。FromResult(0);}
var idToken = ((AuthenticateInfo)HttpContext.Authentication.GetAuthenticateInfoAsync("Cookies").Result).Properties.Items[".Token.id_token"];