Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Autenticación de la API Web de ASP.NET

Estoy buscando para autenticar un usuario de una aplicación cliente mientras utiliza la API Web de ASP.NET . He visto todos los videos en el sitio y también leo este post del foro .

Poner el atributo [Authorize] correctamente devuelve un estado 401 Unauthorized . Sin embargo, tengo que saber cómo permitir que un usuario inicie sesión en la API.

Quiero proporcionar credenciales de usuario desde una aplicación de Android a la API, hacer que el usuario inicie sesión y, a continuación, tener todas las llamadas de API posteriores preautenticadas.

  • Error al cargar libGL.so en Android
  • Textview en el botón (arriba), no funciona en Android 5 (API 21)
  • Android Studio: Utiliza AndroidAnnotations
  • Android studio Error "Módulos no admitidos detectados: la compilación no es compatible con los módulos siguientes"
  • Android parcelable referenciando otra dependencia circular parcelable
  • Carga previa de la página siguiente (o anterior) en ViewPager
  • 3 Solutions collect form web for “Autenticación de la API Web de ASP.NET”

    Permitir que un usuario inicie sesión en la API

    Debe enviar una cookie de autenticación de formularios válida junto con la solicitud. Esta cookie normalmente se envía por el servidor al autenticar (acción LogOn ) llamando al método [FormsAuthentication.SetAuthCookie (vea MSDN ).

    Así que el cliente necesita realizar dos pasos:

    1. Envíe una solicitud HTTP a una acción LogOn enviando el nombre de usuario y la contraseña. En turnos esta acción llamará al método FormsAuthentication.SetAuthCookie (en caso de que las credenciales sean válidas), que a su vez establecerá la cookie de autenticación de formularios en la respuesta.
    2. Envíe una solicitud HTTP a una acción protegida [Authorize] enviando a lo largo de la cookie de autenticación de formularios que recuperó en la primera solicitud.

    Tomemos un ejemplo. Suponga que tiene 2 controladores de API definidos en su aplicación web:

    El primero responsable de manejar la autenticación:

     public class AccountController : ApiController { public bool Post(LogOnModel model) { if (model.Username == "john" && model.Password == "secret") { FormsAuthentication.SetAuthCookie(model.Username, false); return true; } return false; } } 

    Y el segundo contiene acciones protegidas que sólo los usuarios autorizados pueden ver:

     [Authorize] public class UsersController : ApiController { public string Get() { return "This is a top secret material that only authorized users can see"; } } 

    Ahora podríamos escribir una aplicación cliente consumiendo esta API. He aquí un ejemplo trivial de aplicación de consola (asegúrate de haber instalado los paquetes Microsoft.AspNet.WebApi.Client y Microsoft.Net.Http NuGet):

     using System; using System.Net.Http; using System.Threading; class Program { static void Main() { using (var httpClient = new HttpClient()) { var response = httpClient.PostAsJsonAsync( "http://localhost:26845/api/account", new { username = "john", password = "secret" }, CancellationToken.None ).Result; response.EnsureSuccessStatusCode(); bool success = response.Content.ReadAsAsync<bool>().Result; if (success) { var secret = httpClient.GetStringAsync("http://localhost:26845/api/users"); Console.WriteLine(secret.Result); } else { Console.WriteLine("Sorry you provided wrong credentials"); } } } } 

    Y así es como las 2 peticiones HTTP se ven en el cable:

    Solicitud de autenticación:

     POST /api/account HTTP/1.1 Content-Type: application/json; charset=utf-8 Host: localhost:26845 Content-Length: 39 Connection: Keep-Alive {"username":"john","password":"secret"} 

    Respuesta de autenticación:

     HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Wed, 13 Jun 2012 13:24:41 GMT X-AspNet-Version: 4.0.30319 Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly Cache-Control: no-cache Pragma: no-cache Expires: -1 Content-Type: application/json; charset=utf-8 Content-Length: 4 Connection: Close true 

    Solicitud de datos protegidos:

     GET /api/users HTTP/1.1 Host: localhost:26845 Cookie: .ASPXAUTH=REMOVED FOR BREVITY 

    Respuesta para los datos protegidos:

     HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Wed, 13 Jun 2012 13:24:41 GMT X-AspNet-Version: 4.0.30319 Cache-Control: no-cache Pragma: no-cache Expires: -1 Content-Type: application/json; charset=utf-8 Content-Length: 66 Connection: Close "This is a top secret material that only authorized users can see" 

    Tomo android como ejemplo.

     public abstract class HttpHelper { private final static String TAG = "HttpHelper"; private final static String API_URL = "http://your.url/api/"; private static CookieStore sCookieStore; public static String invokePost(String action, List<NameValuePair> params) { try { String url = API_URL + action + "/"; Log.d(TAG, "url is" + url); HttpPost httpPost = new HttpPost(url); if (params != null && params.size() > 0) { HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); httpPost.setEntity(entity); } return invoke(httpPost); } catch (Exception e) { Log.e(TAG, e.toString()); } return null; } public static String invokePost(String action) { return invokePost(action, null); } public static String invokeGet(String action, List<NameValuePair> params) { try { StringBuilder sb = new StringBuilder(API_URL); sb.append(action); if (params != null) { for (NameValuePair param : params) { sb.append("?"); sb.append(param.getName()); sb.append("="); sb.append(param.getValue()); } } Log.d(TAG, "url is" + sb.toString()); HttpGet httpGet = new HttpGet(sb.toString()); return invoke(httpGet); } catch (Exception e) { Log.e(TAG, e.toString()); } return null; } public static String invokeGet(String action) { return invokeGet(action, null); } private static String invoke(HttpUriRequest request) throws ClientProtocolException, IOException { String result = null; DefaultHttpClient httpClient = new DefaultHttpClient(); // restore cookie if (sCookieStore != null) { httpClient.setCookieStore(sCookieStore); } HttpResponse response = httpClient.execute(request); StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } result = builder.toString(); Log.d(TAG, "result is ( " + result + " )"); // store cookie sCookieStore = ((AbstractHttpClient) httpClient).getCookieStore(); return result; } 

    Atención por favor: i.localhost no se puede utilizar. Apariencia de dispositivo Android localhost como propio host. Ii. Si implementa la API web en IIS, debe abrirse la autenticación de formulario.

    Utilice este código y acceda a la base de datos

     [HttpPost] [Route("login")] public IHttpActionResult Login(LoginRequest request) { CheckModelState(); ApiResponse<LoginApiResponse> response = new ApiResponse<LoginApiResponse>(); LoginResponse user; var count = 0; RoleName roleName = new RoleName(); using (var authManager = InspectorBusinessFacade.GetAuthManagerInstance()) { user = authManager.Authenticate(request); } reponse(ok) } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.