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)
}
}
Если я выбрасываю исключение, сообщение об ошибке заменяется на "Там как непредвиденная ошибка"