0
.NETでWebApiを作成しました。 いくつかの方法を保護したいと思います。 私はaspnetuserテーブル内のユーザーは、私がwebapi with basic authorize
public class BasicAuthHttpModule : IHttpModule
として作成したとweb.configファイルで私は
としてこれを構成し
このメソッドを実行することができたいと思います
<system.webServer>
<modules>
<add name="BasicAuthHttpModule" type="WebHostBasicAuth.Modules.BasicAuthHttpModule"/>
</modules>
</system.webServer>
そして、私のBasicAuthHttpModule.cs: 私は
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Web;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using ServicioProx360.Models;
using ServicioProx360;
namespace WebHostBasicAuth.Modules
\t {
\t public class BasicAuthHttpModule: IHttpModule
\t \t {
\t \t private const string Realm = "WebAPI Authentication";
\t \t public void Init(HttpApplication context)
\t \t \t {
\t \t \t // Se registran los manejadores de los eventos
\t \t \t context.AuthenticateRequest += OnApplicationAuthenticateRequest;
\t \t \t context.EndRequest += OnApplicationEndRequest;
\t \t \t }
\t \t private static void SetPrincipal(IPrincipal principal)
\t \t \t {
\t \t \t Thread.CurrentPrincipal = principal;
\t \t \t if (HttpContext.Current != null)
\t \t \t \t {
\t \t \t \t HttpContext.Current.User = principal;
\t \t \t \t }
\t \t \t }
\t \t private static bool AuthenticateUser(string credentials)
\t \t \t {
\t \t \t var encoding = Encoding.GetEncoding("iso-8859-1");
\t \t \t credentials = encoding.GetString(Convert.FromBase64String(credentials));
\t \t \t var credentialsArray = credentials.Split(':');
\t \t \t var username = credentialsArray[0];
\t \t \t var password = credentialsArray[1];
\t \t \t var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
\t \t \t ApplicationUser usuario = manager.Find(username, password);
\t \t \t /* Aquí se validan las credenciales o el token enviado en el encabezado de la solicitud */
// \t \t \t if (!(username == "test" && password == "test"))
\t \t \t if (usuario==null)
\t \t \t \t {
\t \t \t \t return false;
\t \t \t \t }
\t \t \t
\t \t \t var identity = new GenericIdentity(usuario.UserName);
\t \t \t
\t \t \t SetPrincipal(new GenericPrincipal(identity, new string[] { "CIUDADADNO" }));
\t \t \t return true;
\t \t \t }
\t \t private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
\t \t \t {
\t \t \t var request = HttpContext.Current.Request;
\t \t \t var authHeader = request.Headers["Authorization"];
\t \t \t if (authHeader != null)
\t \t \t \t {
\t \t \t \t var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
\t \t \t \t // Se valida si el esquema de autenticación es básico (Basic Authentication)
\t \t \t \t if (authHeaderVal.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && authHeaderVal.Parameter != null)
\t \t \t \t \t {
\t \t \t \t \t AuthenticateUser(authHeaderVal.Parameter);
\t \t \t \t \t }
\t \t \t \t }
\t \t \t }
\t \t // Si la solicitud no fue aprobada, se agrega el encabezado WWW-Authenticate a la respuesta
\t \t private static void OnApplicationEndRequest(object sender, EventArgs e)
\t \t \t {
\t \t \t var response = HttpContext.Current.Response;
\t \t \t if (response.StatusCode == 401)
\t \t \t \t {
\t \t \t \t response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm));
\t \t \t \t }
\t \t \t }
\t \t public void Dispose()
\t \t \t {
\t \t \t }
\t \t }
\t }
私を助けることができますか?
ありがとうございました
私はページを見て、私が発見:私は、新しいWebサービスを作成するとき、私は認証witout選択した場合、それが正常に動作します。しかし私が個々のユーザーを選ぶならば、仕事をしないでください。どうして? – Juanjo