簡體   English   中英

OpenIddict在響應之前獲取token_id

[英]OpenIddict get token_id before response

[AllowAnonymous]
[HttpPost("~/api/auth/login")]
[Produces("application/json")]
public async Task<IActionResult> Login(OpenIdConnectRequest request)
{
  ...
      var ticket = await CreateTicketAsync(request, user);
      _logger.LogInformation($"User logged in (id: {user.Id})");

      // Returning a SignInResult will ask OpenIddict to issue the appropriate access/identity tokens.

      return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
}

OpenIddict在調用SignIn方法之后創建令牌嗎? 發送響應之前,如何訪問創建的refresh_token token_id?

我想將token_id與自定義device_id關聯並保存到數據庫。 然后,我將允許用戶使用指定的設備撤消refresh_token。

這是如何使用最新的RC2程序包(可以在MyGet提要中找到)。

1)創建從內置實體派生的自定義實體:

public class MyApplication : OpenIddictApplication<string, MyAuthorization, MyToken>
{
    public MyApplication() => Id = Guid.NewGuid().ToString();
}

public class MyAuthorization : OpenIddictAuthorization<string, MyApplication, MyToken>
{
    public MyAuthorization() => Id = Guid.NewGuid().ToString();
}

public class MyScope : OpenIddictScope<string>
{
    public MyScope() => Id = Guid.NewGuid().ToString();
}

public class MyToken : OpenIddictToken<string, MyApplication, MyAuthorization>
{
    public MyToken() => Id = Guid.NewGuid().ToString();

    public string DeviceId { get; set; }
}

2)更新您的授權控制器,以將設備標識符存儲為身份驗證屬性:

// ...
var ticket = new AuthenticationTicket(principal, properties,
    OpenIdConnectServerDefaults.AuthenticationScheme);

ticket.SetProperty("device_id", "[the device identifier]");
// ...

3)創建一個自定義令牌管理器,並重寫PopulateAsync方法以將設備標識符附加到存儲在數據庫中的令牌條目:

public class MyManager : OpenIddictTokenManager<MyToken>
{
    public MyManager(
        IOpenIddictTokenStore<MyToken> store,
        ILogger<OpenIddictTokenManager<MyToken>> logger)
        : base(store, logger)
    {
    }

    protected override Task PopulateAsync(MyToken token, OpenIddictTokenDescriptor descriptor, CancellationToken cancellationToken)
    {
        if (descriptor.Properties.TryGetValue("device_id", out var identifier))
        {
            token.DeviceId = identifier;
        }

        return base.PopulateAsync(token, descriptor, cancellationToken);
    }
}

4)更新您的Startup類以使用新實體和定制管理器:

services.AddDbContext<ApplicationDbContext>(options =>
{
    // ...
    options.UseOpenIddict<MyApplication, MyAuthorization, MyScope, MyToken, string>();
});

services.AddOpenIddict<MyApplication, MyAuthorization, MyScope, MyToken>(options =>
{
    // ...
    options.AddTokenManager<MyManager>();
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM