Member 12919448 Ответов: 1

Недопустимый URI: формат URI не может быть определен.


Я тож Asp.Net и я осуществил сброс пароля, я отправить ссылку на адрес электронной почты пользователя, чтобы сбросить пароль.

Вот этот код:

[HttpPost]
    [Route("ForgotPassword")]
    [AllowAnonymous]
    public async Task<IHttpActionResult> ForgotPassword(ForgotPasswordViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindByEmailAsync(model.Email);
            if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
            {
             return BadRequest("Either user does not exist or you have not confirmed your email.");
            }

            try
            {
                // Send an email with this link
                string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
                Url.Link("DefaultApi",
              new { controller = "Account/ConfirmEmail", userId = user.Id, code = code });

                  string callbackUrl = Url.Link("DefaultApi", 
                    new { controller = "Account/ManageAccount/reset-password", userId = user.Id, code = code });
                //string callbackUrl = Url.Link("Default", 
                  //  new { controller = "User/ManageAccount/reset-password", userId = user.Id, code = code });
                await UserManager.SendEmailAsync(user.Id, "Reset Password", 
                    "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
                return Ok();
            }
            catch (Exception ex)
            {
                return InternalServerError(ex);
            }

        }

        return BadRequest();
    }

    // GET api/Account/ManageAccount
    [AcceptVerbs("GET")]
    [AllowAnonymous]
     [Route("ManageAccount")]
    public IHttpActionResult ManageAccount(string id)
    {
        if (! String.IsNullOrEmpty(id))
        {
            string page = id + ".html";

           return Redirect(page);
        }
        return Redirect("Login.html");
    }




    // POST: /Account/ResetPassword
    [HttpPost]
    [AllowAnonymous]
    [Route("ResetPassword")]
    public async Task<IHttpActionResult> ResetPassword(ResetPasswordViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var user = await UserManager.FindByEmailAsync(model.Email);
        if (user == null)
        {
           // return Redirect("https://localhost:44342/Login.html");
        }
        var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
        if (result.Succeeded)
        {
            return Ok();
        }
        return InternalServerError();
    }



Вот webApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new
        System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));


        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling =
            Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);


    }
}


Что я уже пробовал:

В AccountController я попробовал это сделать, но это не работает:

[HttpGet]
[AllowAnonymous]
public async Task<IHttpActionResult> ManageAccount(string id)
{
    if (! String.IsNullOrEmpty(id))
    {
        string page = id + ".html";

       return Redirect(page);
    }
    return Redirect("Login.html");
}




Также,
[AcceptVerbs("GET")]
[AllowAnonymous]
[Route("ManageAccount/{id}")]
public async Task<IHttpActionResult> ManageAccount(string id)
{
    if (! String.IsNullOrEmpty(id))
    {
        string page =  id + ".html";

        return Redirect(page);
    }
    return Redirect("Login.html");
}


Вот ссылка, отправленная на электронную почту:(посмотрите на ее формат) !
http://localhost:7524/api/Account/ManageAccount/reset-password?userId=1011&code=vbGi%2FzN0oFjw6RLlFVuBHiyEz2rH%2FNaO7tc5Y7Y47vzKKC5aNgx9yzZLbHtMD1%2BVZYCot1dvRZSLupPUYcxpCW%2FIl4cJwAIxVjVYA1kxrIjobdrXVqHNMXJmTF5u6cc%2FJdA0uDlQzNjoG4%2Fcjfl3ToRxarZokxI3VN8TEvt1I2M%3D

Когда я нажимаю на него, я получаю:
Недопустимый URI: формат URI не может быть определен.

Что мне нужно, так это вызвать html-страницу "с url-адресом, который имеет идентификатор пользователя и аутентификацию кода" из WebApi

Я действительно застрял, не могли бы вы мне помочь?

ZurdoDev

Что ты пытаешься сделать?
Где ты застрял?

Member 12919448

Я пытаюсь сбросить пароль.
Я отправляю электронное письмо с идентификатором пользователя и кодом для сброса пароля
после того, как пользователь нажимает на эту ссылку, url-адрес имеет его идентификатор и код аутентификации, эта страница запрашивает у пользователя его новый пароль. То, что я нашел, не сработало для меня, оно показало мне, что путь не существует, а код, который я попробовал, показал мне ошибку HTTP 404.0 - не найден

Nirav Prabtani

Вы следовали шаблону маршрута (URL)?

Не могли бы вы упомянуть конечную точку, на которую вы нацелены ?

1 Ответов

Рейтинг:
2

Vincent Maverick Durano

Вы пытаетесь реализовать что-то подобное? Забыли пароль и сбросить пароль ссылка на электронную почту в MVC[^]

Обратите внимание, что MVC и Web API-это почти одно и то же, за исключением того, что MVC обслуживает представления, но концепция одна и та же.