Pergunta

Eu tenho um site ASP.NET MVC que está bloqueado para baixo usando autenticação de formulários. O web.config tem

<authentication mode="Forms">
    <forms defaultUrl="~/Account/LogOn" loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<authorization>
    <deny users="?"/>
</authorization>

Nenhum dos meus outros de Conta / LogOn páginas pode ser visto a menos que o usuário é autenticado.

Agora eu estou tentando adicionar PayPal IPN para o meu site e para fazer isso eu preciso ter duas páginas que a confirmação do pagamento alça do PayPal e obrigado página. Estas duas páginas precisam estar disponíveis para usuários anônimos.

Gostaria estas páginas para ser ações do controlador fora meu controlador de conta. Existe alguma maneira eu possa aplicar um atributo para métodos de ação específicos que os tornam disponíveis a usuários anônimos? Eu encontrei vários posts aqui que a tentativa de fazer isso, mas não havia maioria das pessoas queria o cenário oposto.

Basicamente eu quero classe AccountController maio não ter autorização para a maioria dos métodos exceto para alguns. Agora parece que apenas o método de logon está disponível para usuários anônimos.

Foi útil?

Solução

Sim, pode. Em sua AccountController há um [autorizar] -attribute quer na classe de nível (para fazer todo o controlador restrito) ou em métodos específicos.

Para fazer ações específicas restrita você simplesmente usar a autorizar o atributo sobre os métodos que lidam com essas ações, e deixar o controlador de classe sem restrições.

Aqui estão alguns exemplos ... espero que ajude

Para exigir que os usuários login, use:

[Authorize]
public class SomeController : Controller

// Or
[Authorize]
public ActionResult SomeAction()

Para restringir o acesso para funções específicas, use:

[Authorize(Roles = "Admin, User")]
public class SomeController : Controller

// Or
[Authorize(Roles = "Admin, User")]
public ActionResult SomeAction()

E para restringir o acesso para usuários específicos, use:

[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller

// Or
[Authorize(Users = "Charles, Linus")]
public ActionResult SomeAction()

Como você pode ver, você pode usar o atributo na classe de nível ou pelo método de nível. Sua escolha!

Outras dicas

Eu não acho que há um atributo "Desautorizar" que podem ser aplicados em ações e se você não quer lugar "[autorizar]" em todos, mas duas ações em um controlador tente o seguinte:

Aqui estão dois métodos que eu posso pensar de:

1- atributo Location no Web.config (Não sei se isso vai funcionar com MVC roteamento etc.)

Depois de sua

<system.web> stuff </system.web>

no arquivo web.config, adicione o seguinte:

  <location path="Account/ActionOne">
     <system.web>
           <authorization>
              <allow users ="*" />
          </authorization>
      </system.web>
  </location>

Onde Conta / ActionOne é o nome do método de ação que você quer dar acesso anônimo a. Para a segunda ação, copie o código acima e colá-lo logo depois e alterar o nome da acção.

Eu não tenho certeza se isso vai funcionar por causa da MVC roteamento etc, mas experimentá-lo.

2- Base do Controlador

Se a solução anterior não funcionou, sua melhor aposta seria a criação de um controlador de base que está decorado com o atributo Autorizar:

[Authorize]
public class AuthorizeControllerBase : Controller {}

Então, todos os controladores de herdar a partir dele:

public class AccountController : AuthorizeControllerBase
{
      // your actions etc.
}

Isso fará com que qualquer controlador que herda de AuthorizeControllerBase necessitam de autorização / login para invocar quaisquer métodos.

Em seguida, você precisa remover do seu web.config

Em vez de garantir todos os recursos em seu site por padrão e, em seguida, procurando uma maneira de proporcionar o acesso anônimo para recursos individuais, você provavelmente é melhor tomar a abordagem oposta. Não especificar as regras de autorização em seu web.config, em seguida, usar filtros de autorização (ver resposta de Mickel) para proteger controladores e / ou ações individuais.

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