ASP.NET MVC. Хочу чтобы ссылка открывалась в том же окне, где и почта

343
08 декабря 2016, 22:43

Делаю подтверждение Токена по Email и при подтверждении ссылки в почтовом ящике, осуществляется переход в новую вкладку, мне захотелось сделать переход в том же окне где и почта!

Работает обычная реализация OWIN/KAtana, оригинал отправки письма взят: https: //blogs. msdn.microsoft. com/webdev/2014/02/18/adding-two-factor-authentication-to-an-application-using-asp-net-identity/# (пробелы нужно убрать)

(Сделаны первые 9 пунктов, обычное подтверждение, без пин-кода)

Т.е. метод генерирует токен и шлет на почту ссылку. Пока ссылка на сервере - то все ок, но когда приходит на почту, то target="_blank", хотя с сервера я отсылаю явно target="_self"

Немного кода непомешает:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        ApplicationUser user = new ApplicationUser { UserName = model.Email, Email = model.Email, Year = model.Year };
        //Если пытаемся ввести уже существующий E-mail!!!
        ApplicationUser user2 = UserManager.Find(model.Email, model.Password);
        if (user2 != null) // если есть!
        {
            ModelState.AddModelError("HasUserToDb", "Такой пользователь уже есть базе!");
            return PartialView("Register");
        }
        IdentityResult result = UserManager.Create(user, model.Password);
        if (result.Succeeded)
        {
            //генерим токен для подтверждения регистрации
            var code = UserManager.GenerateEmailConfirmationToken(user.Id);
            //создаем ссылку для подтверждения
            var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            //шлем письмо   +++ТУТ ПРОБЛЕМА с "_self"+++
            string textEmail = "При регистрации учетной записи " + user.Email + " был указан Ваш email.<hr />Для завершения регистрации перейдите по ссылке: <a href=\"" + callbackUrl + "\" target=\"_self\">Завершить регистрацию</a>";
            UserManager.SendEmail(user.Id, "Подтверждение электронной почты", textEmail);
            return PartialView("ShowEmail");
            //return JavaScript("OnSuccess();");
        }
        else //не создаст Юзера
        {  . . . 
  1. Вот что уходит с сервера в результате выполнения Метода

  2. А вот что приходит. Где что-то может идти не так?)

Обновление

@Эркин Итак, это все что есть:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        ApplicationUser user = new ApplicationUser { UserName = model.Email, Email = model.Email, Year = model.Year };
        //Если пытаемся ввести уже существующий E-mail!!!
        ApplicationUser user2 = UserManager.Find(model.Email, model.Password);
        if (user2 != null) // если есть!
        {
            ModelState.AddModelError("HasUserToDb", "Такой пользователь уже есть базе!");
            return PartialView("Register");
        }
        IdentityResult result = UserManager.Create(user, model.Password);
        if (result.Succeeded)
        {
            //генерим токен для подтверждения регистрации
            var code = UserManager.GenerateEmailConfirmationToken(user.Id);
            //создаем ссылку для подтверждения
            var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            //шлем письмо
            string textEmail = "При регистрации учетной записи " + user.Email
                + " был указан Ваш email.<hr />Для завершения регистрации перейдите по ссылке: <a href=\""  + callbackUrl + "\">Завершить регистрацию</a>";
            UserManager.SendEmail(user.Id, "Подтверждение электронной почты ", textEmail);
            return PartialView("ShowEmail");
            //return JavaScript("OnSuccess();");
        }
        else //не создаст Юзера
        { . . . }

. . .

И Собственно сам метод UserManager.SendMail, который переопределен в EmailService : IIdentityMessageService

Вот он:

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        //настройка логина, пароля отправителяz
        var from = "ZZZZZ@yandex.by";
        var pass = "ZZZZZ33241";
        //адрес и порт smtp - сервера, с которого мы и будем отправлять письмо
        SmtpClient client = new SmtpClient("smtp.yandex.ru", 25);
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false; //управляет отправкой учетных данных DefaultCredentials вместе с запросами.
        client.Credentials = new NetworkCredential(from, pass); //Возвращает или задает учетные данные, используемые для проверки подлинности отправителя.
        client.EnableSsl = true; //Указывает, использует ли SmtpClient протокол SSL для шифрования подключения.
        // создаем письмо: message.Destination - адрес получателя
        var mail = new MailMessage(from, message.Destination); //Представляет сообщение электронной почты, которое может быть отправлено с помощью класса SmtpClient.
        mail.Subject = message.Subject; //Получает или задает строку темы для данного сообщения электронной почты.
        mail.Body = "<head><base target =\"_self\"></head>" + message.Body; //Получает или задает основную часть сообщения.
        mail.IsBodyHtml = true; //Получает или задает значение, показывающее, имеет ли основная часть почтового сообщения формат HTML.
        return client.SendMailAsync(mail); //Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.9+
    }
}
Answer 1

попробуйте target=\"_self\" заменить на target='_self'

и в title вашей страницы не забудьте добавить

<base target="_blank">

Если не сработает, покажите ваш код UserManager.SendMail

READ ALSO
Один поток на action [закрыто]

Один поток на action [закрыто]

Читал на хабре статью про async/await и наткнулся на следующую строчку:

216
Linq Left Join: Можно ли оптимизировать linq запрос?

Linq Left Join: Можно ли оптимизировать linq запрос?

Мне необходимо показать пользователю представление, информация для отображении находится в разных таблицах

264
C# XNA как узнать разрешение экрана/окна

C# XNA как узнать разрешение экрана/окна

Нужно узнать текущие разрешение экрана(для полно экранного режима) и отдельно нужно узнать разрешение окна(оконный режим) Есть какие либо...

456
Вызов метода класса по имени

Вызов метода класса по имени

Необходимо вызывать методы класса по имени (те

238