Pergunta

Agora eu estou tentando trabalhar com System.Web.Routing. Tudo está muito bem, mas eu não consigo entender como fazer o trabalho autenticação de formulário com o roteamento de url (retorno url, redirecionamento, etc). Google não diz nada. Socorro! :)

UPD: eu esqueci - I não usar MVC . Esse é o problema. Como usar a autenticação rounig e formulário sem MVC

UPD2: mais sobre o meu problema
O que eu quero chegar: urls como “mysite.com/content/123”, “mysite.com/login/”, etc usando rotas. É importante fazer trabalhos página de login, como forma “regular” de login ASP.NET (redirecionamentos de login de área segura quando não efectuar o login e redirecionamento de volta para a área segura quando loggined).
Isso é o que estou fazendo.
Em global.asax em Application_Start, cadastre-se rotas como este:

routes.Add("LoginPageRoute", new Route("login/", new CustomRouteHandler("~/login.aspx")));
routes.Add("ContentRoute", new Route("content/{id}", new ContentRoute("~/content.aspx"))
{
    Constraints = new RouteValueDictionary {{ "id", @"\d+" }}
});

Onde CustomRouteHandler e ContentRoute - aulas IRouteHandler simples, como: ...

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
    return page;
}

...

Tudo parece ser perfeito: Estou recebendo content.aspx quando ir para “/content/10” e login.aspx quando ir para “/login/”. Mas ...
Quando eu tornar o conteúdo garantido (em web.config, com deny=”?”), formulário de login não funciona como esperado.
Agora eu não posso chegar à página “/content/10”:

0. Eu estou escrevendo “/content/10” no meu navegador.
1. redirecionamentos site para “/login/?ReturnUrl=%2fcontent%2f10”. (Hm ... parece que todos os problemas começa aqui, certo? :)
2. Eu estou tentando entrar. Não importa o que as credenciais Estou entrou ...
3 ... site redirecionar me para “login?ReturnUrl=%2fContent%2f10”. (tela amarela do erro - Access is denied. Descrição:. An error occurred while accessing the resources required to serve this request. The server may not be configured for access to the requested URL)
Então, o problema é como obter ASP.NET entender ReturnUrl real e fornecer redirecionamento após o login.

Foi útil?

Solução

Estas medidas devem permitir que você implementar o comportamento necessário.
Para resumir:

  1. Você está usando roteamento mas não MVC. Meu exemplo irá mapear a url como http: // host / Mysite / ID do usuário / 12345 para uma página real em http:? //host/Mysite/Pages/users.aspx userid = 12345 .
  2. Você deseja controlar o acesso a esses endereços, exigindo que o usuário logon. Meu exemplo tem uma página http: //host/Mysite/login.aspx com um controle de login padrão, e o local é configurado para autenticação de uso formas.

Passo 1

Eu "escondido" o conteúdo das páginas da pasta usando este web.config nas Páginas pasta:

  <?xml version="1.0"?>
  <configuration>
    <system.web>
      <httpHandlers>
        <add path="*" verb="*"
            type="System.Web.HttpNotFoundHandler"/>
      </httpHandlers>
      <pages validateRequest="false">
      </pages>
    </system.web>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <handlers>
        <remove name="BlockViewHandler"/>
        <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler"/>
      </handlers>
    </system.webServer>
  </configuration>  

Isso garante que, se alguém usa uma URL como http: // host / Mysite / páginas / users.aspx? userid = 12345 , em seguida, eles recebem uma resposta padrão 404.

Passo 2

Meu top arquivo nível web.config contém (bem como todo o material padrão) este elemento local:

  <location path="userid">
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
  </location>

Isso impede o acesso anônimo a urls do formulário http: // host / Mysite / ID do usuário / 12345 o que significa que os usuários serão redirecionados automaticamente para login.aspx, então se eles fornecer credenciais válidas, eles serão redirecionados para o local correto.

Passo 3

Para referência aqui é meu global:

<script RunAt="server">

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RegisterRoutes(RouteTable.Routes);
     }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.RouteExistingFiles = true;
        routes.Add("UseridRoute", new Route
        (
           "userid/{userid}",
           new CustomRouteHandler("~/Pages/users.aspx")
        ));
    }

</script>

E aqui está a minha manipulador de rota:

using System.Web.Compilation;
using System.Web.UI;
using System.Web;
using System.Web.Routing;
using System.Security;
using System.Web.Security;


public interface IRoutablePage
{
    RequestContext RequestContext { set; }
}

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        var page = BuildManager.CreateInstanceFromVirtualPath
             (VirtualPath, typeof(Page)) as IHttpHandler;

        if (page != null)
        {
            var routablePage = page as IRoutablePage;

            if (routablePage != null) routablePage.RequestContext = requestContext;
        }

        return page;
    }
}

Outras dicas

O primeiro resultado que eu tenho de uma pesquisa no Google é Frederiks excelente post sobre autenticação de formulários no ASP.NET MVC . Note que a mensagem foi relevante para uma versão anterior do ASP.NET MVC, você terá que escrever e testar o código.

HTH, Indy

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top