Basic Authentication in ASP.NET Web API
原始资料:Basic Authentication in ASP.NET Web API | Microsoft Learn
演示了如何实现basic 身份验证。
注意:
在 Web API 2 中,您应该考虑编写身份验证过滤器或 OWIN 中间件,而不是 HTTP 模块。
In Web API 2, you should consider writing an authentication filter or OWIN middleware, instead of an HTTP module.
微软的这篇文档,还是很有学习价值的,毕竟思路都是相似的。
自定义了一个HttpModule:
namespace WebHostBasicAuth.Modules { public class BasicAuthHttpModule : IHttpModule { private const string Realm = "My Realm"; public void Init(HttpApplication context) { // Register event handlers context.AuthenticateRequest += OnApplicationAuthenticateRequest; context.EndRequest += OnApplicationEndRequest; } private static void SetPrincipal(IPrincipal principal) { Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } } // TODO: Here is where you would validate the username and password. private static bool CheckPassword(string username, string password) { return username == "user" && password == "password"; } private static void AuthenticateUser(string credentials) { try { var encoding = Encoding.GetEncoding("iso-8859-1"); credentials = encoding.GetString(Convert.FromBase64String(credentials)); int separator = credentials.IndexOf(':'); string name = credentials.Substring(0, separator); string password = credentials.Substring(separator + 1); if (CheckPassword(name, password)) { var identity = new GenericIdentity(name); SetPrincipal(new GenericPrincipal(identity, null)); } else { // Invalid username or password. HttpContext.Current.Response.StatusCode = 401; } } catch (FormatException) { // Credentials were not formatted correctly. HttpContext.Current.Response.StatusCode = 401; } } private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) { var request = HttpContext.Current.Request; var authHeader = request.Headers["Authorization"]; if (authHeader != null) { var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader); // RFC 2617 sec 1.2, "scheme" name is case-insensitive if (authHeaderVal.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && authHeaderVal.Parameter != null) { AuthenticateUser(authHeaderVal.Parameter); } } } // If the request was unauthorized, add the WWW-Authenticate header // to the response. private static void OnApplicationEndRequest(object sender, EventArgs e) { var response = HttpContext.Current.Response; if (response.StatusCode == 401) { response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm)); } } public void Dispose() { } } }
要启用 HTTP 模块,请将以下内容添加到 web.config 文件的 system.webServer 部分:
<system.webServer> <modules> <add name="BasicAuthHttpModule" type="WebHostBasicAuth.Modules.BasicAuthHttpModule, YourAssemblyName"/> </modules>
标签:Web,ASP,string,void,Authentication,API,credentials,password From: https://www.cnblogs.com/Tpf386/p/17654304.html