Usando roteamento sem MVC: formulário de autenticação
-
03-07-2019 - |
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.
Solução
Estas medidas devem permitir que você implementar o comportamento necessário.
Para resumir:
- 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 .
- 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