none
Autenticacao MVC RRS feed

  • Pergunta

  • Olá, estou aprendendo a usar o framework MVC e para começar estou lendo o livro Pro ASP.NET MVC Framework.

    Estou desenvolvendo um ecommerce como aplicação inicial, seguindo o tutorial do livro.
    Estou com o seguinte problema:

    Para inserir um produto no carrinho, é preciso estar logado. Seguindo o tutorial do livro, na controladora eu tenho um método de adicionar normal, porém sem autenticação. Para exigir a autenticação, eu acrescentei <Authorize>  para redirecionar para a página de Login. Meu problema é que após efetuar o login, eu fico perdido, sem saber para onde redirecionar. No caso citado, deveria adicionar o produto no carrinho. Alguém pode me ajudar?
    quinta-feira, 15 de outubro de 2009 20:49

Respostas

  • Mkoka,

    A tela que você usa para enviar as informações para o Action AddToCart possui um form?

    Se sim, este form esta dando um post para o Action AddToCart, se você mudar o method deste form para get os parametros iram juntos da URL.

    Se ajudar não se esqueça de marcar como resposta as iterações úteis.
    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT
    • Sugerido como Resposta Douglas Aguiar sexta-feira, 16 de outubro de 2009 17:35
    • Editado Douglas Aguiar sábado, 17 de outubro de 2009 11:56 palavra errada
    • Marcado como Resposta mkoka quarta-feira, 21 de outubro de 2009 17:45
    sexta-feira, 16 de outubro de 2009 17:35

Todas as Respostas

  • Teu ActionResult do Login (post) não tem no QueryString o parâmetro ReturnUrl ??
    quinta-feira, 15 de outubro de 2009 23:51
  • Mkoka,

    Para você usar o ReturnUrl citado pelo Ricardo você tem que configurar a sua aplicação para que o atributo Authorize redirecione para o Action de LogOn, acredito que isto já esta configurado na sua aplicação, mas para não perdermos o contexto veja o exemplo abaixo desta configuração no Web.config:

        <authentication mode="Forms">
          <forms loginUrl="~/Account/LogOn" timeout="2880"/>
        </authentication>

    Acima estou informando para a aplicação que o Action LogOn encontrasse dentro do controller Account, toda vez que um usuário não autenticado tenta acessar um Action que necessita de autenticação o proprio ASP NET informa para a pagina de LogOn qual recurso o usuário estava tentando acessar através da queryString ReturnUrl, dai basta você usar este parametro para redirecionar o usuário para o recurso que ele estava tentando acessar após a autenticação ocorrer com sucesso, veja o exemplo abaixo:

    Primeiramente o ASP NET chama o Action LogOn sem passar nenhum parametro:

            public ActionResult LogOn()
            {
                //Retornarmos a tela para que o usuário possar informar
                //o nome de usuário e a senha
                return View();
            }

    A view de LogOn pode estar da seguinte forma:

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="LiteFx.Web.Mvc.BaseViewPage" Theme="Default" %>
    
    <asp:Content ID="loginTitle" ContentPlaceHolderID="TitleContent" runat="server">
        Log On
    </asp:Content>
    
    <asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server">
        <h2>Log On</h2>
        <p>
            Please enter your username and password. <%= Html.ActionLink("Register", "Register") %> if you don't have an account.
        </p>
        <%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>
    
        <% using (Html.BeginForm()) { %>
            <div>
                <fieldset>
                    <legend>Account Information</legend>
                    <p>
                        <label for="username">Username:</label>
                        <%= Html.TextBox("username") %>
                        <%= Html.ValidationMessage("username") %>
                    </p>
                    <p>
                        <label for="password">Password:</label>
                        <%= Html.Password("password") %>
                        <%= Html.ValidationMessage("password") %>
                    </p>
                    <p>
                        <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
                    </p>
                    <p>
                        <input type="submit" value="Log On" />
                    </p>
                </fieldset>
            </div>
        <% } %>
    </asp:Content>
    



    E ao clicar no submit o ASP NET vai incluir automaticamente a queryString returnUrl, e você pode usa-lo da seguinte forma:

            public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
            {
                //Verifica se o usuário é valido
                if (!ValidateLogOn(userName, password))
                {
                    //Senão retorna a view de logOn informando que o usuário não é válido
                    return View();
                }
                //Se o usuário é valido o autenticamos
                FormsAuth.SignIn(userName, rememberMe);
                //Após isto verificamos o returnUrl para redirecionarmos para o recurso adequado
                if (!String.IsNullOrEmpty(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
    


    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT

    • Sugerido como Resposta Douglas Aguiar sexta-feira, 16 de outubro de 2009 02:16
    • Editado Douglas Aguiar sexta-feira, 16 de outubro de 2009 02:22 Bloco de código desformatado.
    sexta-feira, 16 de outubro de 2009 02:16
  • Douglas Aguiar, muito obrigado pelo post. Eu consegui avançar até certo ponto, porém está dando outro problema.
    Eu estou conseguindo obter o returnUrl para "carrinho/addToCart" normal, porém esse método possui parâmetros, e está dando erro ao redirecionar, penso eu, que por falta desses parâmetros.
    <Authorize()> _
    


    Public Function AddToCart(ByVal carrinho As Carrinho, ByVal produtoID As Integer, ByVal returnUrl As String) As RedirectToRouteResult Dim produto As Produto = productsRepository.Produtos.FirstOrDefault(Function(x) x.Id = produtoID) carrinho.AdicionarItem(produto, 1) Return RedirectToAction("Index", New With {.returnUrl = returnUrl}) End Function

    Está dando o seguinte erro:

    The parameters dictionary contains a null entry for parameter 'produtoID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.RedirectToRouteResult AddToCart(DomainModel.Entidades.Carrinho, Int32, System.String)' in 'WebUI.CartController'. To make a parameter optional its type should be either a reference type or a Nullable type.
    Nome do parâmetro: parameters.

    Obrigado pela atenção.
    sexta-feira, 16 de outubro de 2009 12:41
  • Mkoka,

    Você deve de estar dando um Post no Action AddToCart daí os parametros da query string vão ocultos no request.
    Para evitar este comportamento você deve mudar o method do seu form para get, pois ai os dados vão estar na url evitando este problema.

    Se ajudar não se esqueça de marcar como resposta as iterações úteis.
    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT
    • Sugerido como Resposta Douglas Aguiar sexta-feira, 16 de outubro de 2009 17:07
    sexta-feira, 16 de outubro de 2009 17:07
  • Douglas Aguiar, como assim dando um "Post"? Se for o posto que estou pensando, eu não estou utilizando, que no caso seria "<AcceptVerbs ( Http.Post)>".
    O Action está igual eu coloquei no exemplo acima, somente com o Authorize.
    sexta-feira, 16 de outubro de 2009 17:13
  • Mkoka,

    A tela que você usa para enviar as informações para o Action AddToCart possui um form?

    Se sim, este form esta dando um post para o Action AddToCart, se você mudar o method deste form para get os parametros iram juntos da URL.

    Se ajudar não se esqueça de marcar como resposta as iterações úteis.
    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT
    • Sugerido como Resposta Douglas Aguiar sexta-feira, 16 de outubro de 2009 17:35
    • Editado Douglas Aguiar sábado, 17 de outubro de 2009 11:56 palavra errada
    • Marcado como Resposta mkoka quarta-feira, 21 de outubro de 2009 17:45
    sexta-feira, 16 de outubro de 2009 17:35
  • Douglas, eu já criei um post fazendo essa pergunta mas ninguém me respondeu ainda.
    Preciso realizar múltiplas autenticações, vc sabe me dizer como posso fazer?
    Tipo, a aplicação web terá vários objetos, sendo que para eu acessar cada objeto eu preciso ter uma autenticação diferente.
    Obrigaodo.
    quarta-feira, 28 de outubro de 2009 10:46
  • Mkoka,

    Vi o seu tópico lá no forum do ASP NET MVC (http://social.msdn.microsoft.com/Forums/pt-BR/mvcpt/thread/5fbc5e2e-4c22-45af-857f-aece1c82c5e1). Qeuro te responder por lá, mas preciso de mais informações sobre o seu problema.

    Quero entende-lo melhor para lhe dar uma resposta adequada.

    Postei uma pergunta para você lá no outro tópico.

    Espero poder ajuda-lo.

    Douglas Aguiar
    MCAD, MCT
    • Sugerido como Resposta Douglas Aguiar quarta-feira, 28 de outubro de 2009 13:03
    quarta-feira, 28 de outubro de 2009 13:03