ASP Net Core Auth - RedirectToAction вернуться к целевому действию - PullRequest
0 голосов
/ 18 марта 2019

В проекте ASP.NET Core Rest API я настроил пользовательскую аутентификацию и могу комментировать действия контроллера с помощью атрибута [Authorize], который перенаправляет неавторизованные запросы обратно в мой AuthController:

[Route("api/[controller]")]
[ApiController]
public class ResponseController : ControllerBase
{
    [Authorize]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return JsonConvert.SerializeObject(Repository.GetResponse(id), Formatting.Indented);
    }
}

[Route("api/[controller]")]
[ApiController]
public class MetaController : ControllerBase
{
    [Authorize]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return JsonConvert.SerializeObject(Repository.GetMeta(id), Formatting.Indented);
    }
}

[Route("api/[controller]")]
[ApiController]
public class AuthController : Controller
{
    UserManager _userManager;
    public AuthController(UserManager userManager)
    {
        _userManager = userManager;
    }
    [HttpGet]
    [HttpPost]
    public ActionResult<string> LogIn()
    {
        try
        {
            //authenticate
            var username = Request.Headers["username"];
            var password = Request.Headers["pass"];
            if (String.IsNullOrEmpty(username) || String.IsNullOrEmpty(password))
                throw new Exception("Authentication Exception: Missing Username or Password");

            Task.Run(async () => {
                await _userManager.SignInAsync(this.HttpContext, username, password);
            }).GetAwaiter().GetResult();

            return RedirectToAction("Search", "Home", null);
            //^^^ How to send back to intended action?^^^
        }
        catch (Exception ex)
        {
            return AuthError();
        }
    }
}

Это работает, за исключением того, как я могу использовать метод RedirectToAction для возврата обратно к намеченному контроллеру (MetaController или ResponseController, в данном случае)? (тот, чей метод помечен [Authorize], что для начала помещает нас в этот контроллер аутентификации)

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вам необходимо использовать параметр returnUrl, например:

[HttpGet]
[HttpPost]
public async Task<IActionResult> LogIn(string returnUrl = null)
{
    try
    {
        //authenticate
        var username = Request.Headers["username"];
        var password = Request.Headers["pass"];
        if (String.IsNullOrEmpty(username) || String.IsNullOrEmpty(password))
            throw new Exception("Authentication Exception: Missing Username or Password");

        await _userManager.SignInAsync(this.HttpContext, username, password);
        if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }

        return RedirectToAction("Search", "Home", null);
    }
    catch (Exception ex)
    {
        return BadRequest(new {error = "Authentication Failed"});
    }
}

Я также исправляю async / await для действий контроллера. Вам нужно использовать async Task<ActionResult> вместо вашего ActionResult<string>

1 голос
/ 18 марта 2019

Вместо перенаправления создайте свой собственный атрибут, унаследованный от AuthorizeAttribute, и переопределите метод OnAuthorization.Таким образом, вам не нужно беспокоиться о перенаправлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...