Non esiste una cosa come il modo migliore e la risposta è sempre it depends
, anche se è molto utile. Ad esempio, è possibile utilizzare forms authentication. Se l'applicazione Web che utilizza il servizio Web e il servizio Web fanno parte dello stesso ASP.NET application
, il browser può inviare senza problemi il ticket di autenticazione dei moduli (cookie) per ogni chiamata al servizio web.
Nel file di configurazione, è possibile avere
<authorization>
<deny users="?" />
</authorization>
Ciò negare l'accesso agli utenti anonimi e che coprirà i servizi web come bene. In altre parole, a meno che un utente non acceda e ottenga un cookie valido con il ticket, il servizio non può essere utilizzato. Certo, devi HTTPS
. Altrimenti, chiunque nel mezzo può ottenere il cookie nelle intestazioni e chiamare il servizio.
Infine, non è possibile garantire che nessuno chiami il servizio Web al di fuori dell'applicazione in senso assoluto. L'approccio sopra riportato garantisce che nessuno nel mezzo chiami il tuo servizio. Ma non c'è modo di garantire che un utente valido chiami il servizio direttamente al di fuori dell'applicazione perché il chiamante del servizio web è JavaScript e qualsiasi sicurezza che si crea in JavaScript può essere facilmente individuata da un utente guardando lo script o anche guardando il traffico da e verso il browser. Qualsiasi utente finale che è un po 'tecnico, sarà in grado di riprodurre le richieste o modificare le richieste e inviare al servizio web utilizzando credenziali valide.
EDIT: -
Ecco i dettagli che stai cercando per consentire FormsAuthentication.
(1) In Web.config
, sotto <system.web>
, assicurarsi di avere questo.
<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="~/" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
Ciò garantirà che tutti gli utenti non autenticati (anonimi) vengano reindirizzati a Login.aspx.
(2) Implementare Login.aspx
con la logica di accesso per ottenere l'ID utente e la password e convalidarli su un database o qualsiasi altra cosa. Una volta che l'autenticazione ha avuto successo, cioè l'ID immesso dall'utente e la password corrispondono a ciò che si ha nel database, potrebbero essere nel gestore di clic del pulsante di accesso, impostare il ticket.
protected void Button1_Click(object sender, EventArgs e)
{
// Do all your login logic here
// once user ID and password entered by the user are okay, call this
string ticket = FormsAuthentication.Encrypt(
new FormsAuthenticationTicket("userId", false, 15));
HttpCookie FormsCookie = new HttpCookie(
FormsAuthentication.FormsCookieName, ticket) { HttpOnly = true };
HttpContext.Current.Response.Cookies.Add(FormsCookie);
}
(3) Aggiungere PrincipalPermissionAttribute
al metodo web come questo.
public class Users : System.Web.Services.WebService
{
[PrincipalPermissionAttribute(SecurityAction.Demand)]
[WebMethod]
public List<User> GetUsers()
{
// Same code as what you have now
}
}
Se ora si va in qualsiasi pagina, sarete reindirizzati al Login.aspx dove sarà necessario immettere l'ID utente e la password e login. Al momento dell'accesso, il cookie di autenticazione dei moduli verrà creato e scritto nella risposta.Da quel momento in poi, tutte le richieste alla tua applicazione introdurranno il cookie (il browser lo farà per te). Senza accedere, se si accede direttamente al servizio Web, verrà comunque reindirizzato alla pagina di accesso. Come ho accennato nella mia risposta originale, un utente che ha effettuato l'accesso sarà comunque in grado di accedere direttamente al servizio web. Se JavaScript può fare qualcosa, un utente può fare lo stesso.
BTW, i servizi Web (asmx) sono una tecnologia obsoleta.
dato quello che è l'applicazione che chiama il servizio web? ASP.NET Web Forms, MVC? La parte .asmx della stessa applicazione è? In che modo è garantita l'applicazione web che chiama .asmx? Stai usando l'autenticazione basata su form per questo? – Badri
@Badri - Grazie per le vostre domande. Uso i Web Form ASP.NET. L'asmx è nella stessa applicazione. Faccio una domanda di chat e voglio usare un webservice per salvare il messaggio e recuperare il nuovo messaggio. Voglio fare un webservice sicuro per l'invio di messaggi in chat. La chat può utilizzare solo l'utente registrato. Per l'autenticazione voglio utilizzare l'autenticazione della forma. – Jenan