in src/Microsoft.Azure.SignalR.Management/Negotiation/NegotiateProcessor.cs [29:70]
public async Task<NegotiationResponse> NegotiateAsync(string hubName, NegotiationOptions negotiationOptions, CancellationToken cancellationToken = default)
{
negotiationOptions ??= NegotiationOptions.Default;
var httpContext = negotiationOptions.HttpContext;
var userId = negotiationOptions.UserId;
var claims = negotiationOptions.Claims;
var isDiagnosticClient = negotiationOptions.IsDiagnosticClient;
var enableDetailedErrors = negotiationOptions.EnableDetailedErrors;
var lifetime = negotiationOptions.TokenLifetime;
try
{
if (cancellationToken == default && httpContext != null)
{
cancellationToken = httpContext.RequestAborted;
}
var candidateEndpoints = _serviceEndpointManager.GetEndpoints(hubName);
var selectedEndpoint = _router.GetNegotiateEndpoint(httpContext, candidateEndpoints);
var provider = _serviceEndpointManager.GetEndpointProvider(selectedEndpoint);
Func<IEnumerable<Claim>> claimProvider = null;
if (claims != null)
{
claimProvider = () => claims;
}
var closeOnAuthenticationExpiration = negotiationOptions.CloseOnAuthenticationExpiration;
var authenticationExpiresOn = closeOnAuthenticationExpiration ? DateTimeOffset.UtcNow.Add(negotiationOptions.TokenLifetime) : default(DateTimeOffset?);
var claimsWithUserId = ClaimsUtility.BuildJwtClaims(httpContext?.User, userId: userId, claimProvider, enableDetailedErrors: enableDetailedErrors, isDiagnosticClient: isDiagnosticClient, closeOnAuthenticationExpiration: closeOnAuthenticationExpiration, authenticationExpiresOn: authenticationExpiresOn);
var tokenTask = provider.GenerateClientAccessTokenAsync(hubName, claimsWithUserId, lifetime);
await tokenTask.OrTimeout(cancellationToken, Timeout, GeneratingTokenTaskDescription);
return new NegotiationResponse
{
Url = provider.GetClientEndpoint(hubName, null, null),
AccessToken = tokenTask.Result
};
}
catch (Exception e) when (e is OperationCanceledException || e is TimeoutException)
{
throw new AzureSignalRException(ErrorMsg, e);
}
}