2017-04-22 17 views
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 }
タブラaspnetusersでメールアドレスとパスワードを確認するが、それは仕事の罰金をdoen't。メソッドが[権限]であれば、電子メールとパスワードを求めて、正しいデータを入れますが、もう一度もう一度尋ねます。

私を助けることができますか?

ありがとうございました

答えて

0

このチュートリアルでは、かなりうまく説明しています。

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/basic-authentication

+0

私はページを見て、私が発見:私は、新しいWebサービスを作成するとき、私は認証witout選択した場合、それが正常に動作します。しかし私が個々のユーザーを選ぶならば、仕事をしないでください。どうして? – Juanjo