@ -1,7 +1,11 @@
using System.Threading ;
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.Threading ;
using System.Threading.Tasks ;
using AspNet.Security.OpenIdConnect.Client ;
using AspNet.Security.OpenIdConnect.Primitives ;
using Microsoft.AspNetCore.Authentication ;
using Microsoft.AspNetCore.Builder ;
using Microsoft.AspNetCore.Http ;
using Microsoft.Extensions.DependencyInjection ;
@ -14,6 +18,209 @@ namespace OpenIddict.Tests
{
public partial class OpenIddictProviderTests
{
[Fact]
public async Task SerializeAccessToken_AccessTokenIsNotPersistedWhenReferenceTokensAreDisabled ( )
{
// Arrange
var manager = CreateTokenManager ( ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( manager ) ;
builder . Configure ( options = > options . RevocationEndpointPath = PathString . Empty ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( TokenEndpoint , new OpenIdConnectRequest
{
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess
} ) ;
// Assert
Assert . NotNull ( response . AccessToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AccessToken , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
}
[Fact]
public async Task SerializeAccessToken_ReferenceAccessTokenIsCorrectlyPersisted ( )
{
// Arrange
var token = new OpenIddictToken
{
End = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 1 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
Start = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 2 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
} ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AccessToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( manager ) ;
builder . UseReferenceTokens ( ) ;
builder . Configure ( options = >
{
options . SystemClock = Mock . Of < ISystemClock > ( mock = > mock . UtcNow = = token . Start . Value ) ;
options . AccessTokenLifetime = token . End . Value - token . Start . Value ;
} ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( TokenEndpoint , new OpenIdConnectRequest
{
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess
} ) ;
// Assert
Assert . NotNull ( response . AccessToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AccessToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeAccessToken_ClientApplicationIsAutomaticallyAttached ( )
{
// Arrange
var token = new OpenIddictToken ( ) ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AccessToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
instance . Setup ( mock = > mock . SetClientAsync ( token , "3E228451-1555-46F7-A471-951EFBA23A56" , It . IsAny < CancellationToken > ( ) ) )
. Returns ( Task . FromResult ( 0 ) ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( CreateApplicationManager ( instance = >
{
var application = new OpenIddictApplication ( ) ;
instance . Setup ( mock = > mock . FindByClientIdAsync ( "Fabrikam" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( application ) ;
instance . Setup ( mock = > mock . GetClientTypeAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( OpenIddictConstants . ClientTypes . Public ) ;
instance . Setup ( mock = > mock . GetIdAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ) ;
builder . Services . AddSingleton ( manager ) ;
builder . UseReferenceTokens ( ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( TokenEndpoint , new OpenIdConnectRequest
{
ClientId = "Fabrikam" ,
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess
} ) ;
// Assert
Assert . NotNull ( response . AccessToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . SetClientAsync ( token , "3E228451-1555-46F7-A471-951EFBA23A56" , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeAccessToken_AuthorizationIsAutomaticallyAttached ( )
{
// Arrange
var token = new OpenIddictToken ( ) ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AccessToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
instance . Setup ( mock = > mock . SetAuthorizationAsync ( token , "1AF06AB2-A0FC-4E3D-86AF-E04DA8C7BE70" , It . IsAny < CancellationToken > ( ) ) )
. Returns ( Task . FromResult ( 0 ) ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( CreateAuthorizationManager ( instance = >
{
instance . Setup ( mock = > mock . FindByIdAsync ( "1AF06AB2-A0FC-4E3D-86AF-E04DA8C7BE70" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( new OpenIddictAuthorization ( ) ) ;
} ) ) ;
builder . Services . AddSingleton ( manager ) ;
builder . UseReferenceTokens ( ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( TokenEndpoint , new OpenIdConnectRequest
{
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess ,
["attach-authorization"] = true
} ) ;
// Assert
Assert . NotNull ( response . AccessToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . SetAuthorizationAsync ( token , "1AF06AB2-A0FC-4E3D-86AF-E04DA8C7BE70" , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeAuthorizationCode_AuthorizationCodeIsNotPersistedWhenRevocationIsDisabled ( )
{
@ -59,18 +266,27 @@ namespace OpenIddict.Tests
// Assert
Assert . NotNull ( response . Code ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
}
[Fact]
public async Task SerializeAuthorizationCode_AuthorizationCodeIsCorrectlyPersisted ( )
{
// Arrange
var token = new OpenIddictToken ( ) ;
var token = new OpenIddictToken
{
End = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 2 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
Start = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 1 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
} ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -97,6 +313,12 @@ namespace OpenIddict.Tests
} ) ) ;
builder . Services . AddSingleton ( manager ) ;
builder . Configure ( options = >
{
options . SystemClock = Mock . Of < ISystemClock > ( mock = > mock . UtcNow = = token . Start . Value ) ;
options . AuthorizationCodeLifetime = token . End . Value - token . Start . Value ;
} ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
@ -112,7 +334,81 @@ namespace OpenIddict.Tests
// Assert
Assert . NotNull ( response . Code ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeAuthorizationCode_ReferenceAuthorizationCodeIsCorrectlyPersisted ( )
{
// Arrange
var token = new OpenIddictToken
{
End = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 2 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
Start = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 1 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
} ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( CreateApplicationManager ( instance = >
{
var application = new OpenIddictApplication ( ) ;
instance . Setup ( mock = > mock . FindByClientIdAsync ( "Fabrikam" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( application ) ;
instance . Setup ( mock = > mock . HasRedirectUriAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( true ) ;
instance . Setup ( mock = > mock . ValidateRedirectUriAsync ( application , "http://www.fabrikam.com/path" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( true ) ;
instance . Setup ( mock = > mock . GetClientTypeAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( OpenIddictConstants . ClientTypes . Public ) ;
} ) ) ;
builder . Services . AddSingleton ( manager ) ;
builder . UseReferenceTokens ( ) ;
builder . Configure ( options = >
{
options . SystemClock = Mock . Of < ISystemClock > ( mock = > mock . UtcNow = = token . Start . Value ) ;
options . AuthorizationCodeLifetime = token . End . Value - token . Start . Value ;
} ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( AuthorizationEndpoint , new OpenIdConnectRequest
{
ClientId = "Fabrikam" ,
RedirectUri = "http://www.fabrikam.com/path" ,
ResponseType = OpenIdConnectConstants . ResponseTypes . Code
} ) ;
// Assert
Assert . NotNull ( response . Code ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
@ -124,7 +420,10 @@ namespace OpenIddict.Tests
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -183,7 +482,10 @@ namespace OpenIddict.Tests
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -235,6 +537,7 @@ namespace OpenIddict.Tests
ClientId = "Fabrikam" ,
RedirectUri = "http://www.fabrikam.com/path" ,
ResponseType = OpenIdConnectConstants . ResponseTypes . Code ,
["attach-authorization"] = true
} ) ;
// Assert
@ -243,6 +546,72 @@ namespace OpenIddict.Tests
Mock . Get ( manager ) . Verify ( mock = > mock . SetAuthorizationAsync ( token , "1AF06AB2-A0FC-4E3D-86AF-E04DA8C7BE70" , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeAuthorizationCode_AdHocAuthorizationIsAutomaticallyCreated ( )
{
// Arrange
var token = new OpenIddictToken ( ) ;
var manager = CreateAuthorizationManager ( instance = >
{
instance . Setup ( mock = > mock . FindByIdAsync ( "1AF06AB2-A0FC-4E3D-86AF-E04DA8C7BE70" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( new OpenIddictAuthorization ( ) ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( CreateApplicationManager ( instance = >
{
var application = new OpenIddictApplication ( ) ;
instance . Setup ( mock = > mock . FindByClientIdAsync ( "Fabrikam" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( application ) ;
instance . Setup ( mock = > mock . HasRedirectUriAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( true ) ;
instance . Setup ( mock = > mock . ValidateRedirectUriAsync ( application , "http://www.fabrikam.com/path" , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( true ) ;
instance . Setup ( mock = > mock . GetClientTypeAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( OpenIddictConstants . ClientTypes . Public ) ;
instance . Setup ( mock = > mock . GetIdAsync ( application , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ) ;
builder . Services . AddSingleton ( CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . AuthorizationCode , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ) ;
builder . Services . AddSingleton ( manager ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( AuthorizationEndpoint , new OpenIdConnectRequest
{
ClientId = "Fabrikam" ,
RedirectUri = "http://www.fabrikam.com/path" ,
ResponseType = OpenIdConnectConstants . ResponseTypes . Code ,
} ) ;
// Assert
Assert . NotNull ( response . Code ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync ( "Bob le Magnifique" , "3E228451-1555-46F7-A471-951EFBA23A56" ,
It . IsAny < IEnumerable < string > > ( ) , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeRefreshToken_RefreshTokenIsNotPersistedWhenRevocationIsDisabled ( )
{
@ -272,18 +641,80 @@ namespace OpenIddict.Tests
// Assert
Assert . NotNull ( response . RefreshToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
}
[Fact]
public async Task SerializeRefreshToken_RefreshTokenIsCorrectlyPersisted ( )
{
// Arrange
var token = new OpenIddictToken ( ) ;
var token = new OpenIddictToken
{
End = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 2 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
Start = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 1 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero )
} ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( "3E228451-1555-46F7-A471-951EFBA23A56" ) ;
} ) ;
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( manager ) ;
builder . Configure ( options = >
{
options . SystemClock = Mock . Of < ISystemClock > ( mock = > mock . UtcNow = = token . Start . Value ) ;
options . RefreshTokenLifetime = token . End . Value - token . Start . Value ;
} ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
// Act
var response = await client . PostAsync ( TokenEndpoint , new OpenIdConnectRequest
{
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess
} ) ;
// Assert
Assert . NotNull ( response . RefreshToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
[Fact]
public async Task SerializeRefreshToken_ReferenceRefreshTokenIsCorrectlyPersisted ( )
{
// Arrange
var token = new OpenIddictToken
{
End = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 2 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
Start = new DateTimeOffset ( 2 0 1 7 , 0 1 , 0 1 , 0 0 , 0 0 , 0 0 , TimeSpan . Zero ) ,
} ;
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -293,6 +724,14 @@ namespace OpenIddict.Tests
var server = CreateAuthorizationServer ( builder = >
{
builder . Services . AddSingleton ( manager ) ;
builder . UseReferenceTokens ( ) ;
builder . Configure ( options = >
{
options . SystemClock = Mock . Of < ISystemClock > ( mock = > mock . UtcNow = = token . Start . Value ) ;
options . RefreshTokenLifetime = token . End . Value - token . Start . Value ;
} ) ;
} ) ;
var client = new OpenIdConnectClient ( server . CreateClient ( ) ) ;
@ -309,7 +748,10 @@ namespace OpenIddict.Tests
// Assert
Assert . NotNull ( response . RefreshToken ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
It . IsNotNull < string > ( ) , It . IsNotNull < string > ( ) ,
token . Start , token . End , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
Mock . Get ( manager ) . Verify ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) , Times . Once ( ) ) ;
}
@ -321,7 +763,10 @@ namespace OpenIddict.Tests
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -376,7 +821,10 @@ namespace OpenIddict.Tests
var manager = CreateTokenManager ( instance = >
{
instance . Setup ( mock = > mock . CreateAsync ( OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" , It . IsAny < CancellationToken > ( ) ) )
instance . Setup ( mock = > mock . CreateAsync (
OpenIdConnectConstants . TokenTypeHints . RefreshToken , "Bob le Magnifique" ,
It . IsAny < DateTimeOffset ? > ( ) , It . IsAny < DateTimeOffset ? > ( ) ,
It . IsAny < CancellationToken > ( ) ) )
. ReturnsAsync ( token ) ;
instance . Setup ( mock = > mock . GetIdAsync ( token , It . IsAny < CancellationToken > ( ) ) )
@ -405,7 +853,8 @@ namespace OpenIddict.Tests
GrantType = OpenIdConnectConstants . GrantTypes . Password ,
Username = "johndoe" ,
Password = "A3ddj3w" ,
Scope = OpenIdConnectConstants . Scopes . OfflineAccess
Scope = OpenIdConnectConstants . Scopes . OfflineAccess ,
["attach-authorization"] = true
} ) ;
// Assert