IdentityServer3, как отобразить пользовательское сообщение об ошибке в представлении об ошибке

Я реализовал пользовательский пользовательский сервис и пытаюсь отобразить пользовательское сообщение, когда что-то идет не так.

Если я выброшу исключение, я получу метод ошибки IViewService. Это ожидается, но IdentityServer создает новый ErrorViewModel, содержащий новое сообщение об ошибке, а не мое исходное сообщение.

В качестве обходного пути вместо выдачи исключения я возвращаю сбой AuthenticationResult. Это приведет меня к методу входа в систему IViewService, как и ожидалось. Здесь мое исходное сообщение сохраняется, поэтому я выполняю проверку и перенаправляю на метод Error.

Вопрос: Как я могу отобразить сообщения об ошибках из исключений, которые я выбрасываю в IdentityServer на странице ошибок, которая отображает ErrorViewModel?

Пользовательский сервис

public class STSUserService : UserServiceBase
{

    public override Task AuthenticateExternalAsync(ExternalAuthenticationContext context)
    {
        var externalUser = context.ExternalIdentity;    

        // find external user
        var user = FindByExternalProvider(provider, providerUserId);

        if (user == null)
        {
            _eventService.RaiseAsync(                 

            var authenticateErrorResult = new AuthenticateResult("Unable to find external user");
            context.AuthenticateResult = authenticateErrorResult;

            //throw new AuthenticationException("Unable to find external user");
            return Task.FromResult(authenticateErrorResult);
        }


        context.AuthenticateResult = authenticateResult;
        return Task.FromResult(authenticateResult);
    }
}

Пользовательский сервис просмотра

    public class CustomViewService : IViewService
{
    private readonly IClientStore clientStore;

    public CustomViewService(IClientStore clientStore)
    {
        this.clientStore = clientStore;
    }

    public virtual async Task<Stream> Login(LoginViewModel model, SignInMessage message)
    {
        if (model.ErrorMessage.Equals("Unable to find external user", StringComparison.CurrentCultureIgnoreCase))
        {
            return await Render(new ErrorViewModel
                {
                    ErrorMessage = model.ErrorMessage
                    ,RequestId = model.RequestId
                    ,CurrentUser = model.CurrentUser
                    ,LogoutUrl = model.LogoutUrl
                    ,SiteName = model.SiteName
                    ,SiteUrl = model.SiteUrl
                },
                "error"); // create ErrorViewModel & use error view (workaround)
        }       
    }

Если я выбрасываю исключение, сообщение об ошибке заменяется на "Там как непредвиденная ошибка"

введите описание изображения здесь

0 ответов

Другие вопросы по тегам