如何在现有用户的情况下向ASP.NETWebneneneba API添加身份验证
本文关键字:ASP NETWebneneneba API 身份验证 添加 情况下 用户 | 更新日期: 2023-09-27 18:14:35
- 我将用户存储在我们自己的自定义数据库中
- 我开发了一个ASP.NETWeb2 API
- 我没有现有的网站,客户端也没有使用浏览器(因此无法使用表单身份验证(
- 我需要使用现有的用户,所以不能使用ASP.NET的Identity,它使用自己的表
如何最好地将身份验证添加到API?我想利用现有的基础设施,例如Authorize
属性。
(此问题:ASP.NET Web API中的用户身份验证无法回答我的问题,因为它只建议了两种身份验证方法:表单身份验证和Windows集成身份验证,这两种方法我都不能使用(。
我喜欢在消息处理程序中使用自定义身份验证机制。由于我不知道关于安全级别的要求,所以不可能说你应该使用什么样的机制。如果您使用SSL,那么基本身份验证就足够了。
使用自定义用户存储进行基本身份验证的简单处理程序如下所示:
public class BasicAuthMessageHandler : DelegatingHandler
{
private const string ResponseHeader = "WWW-Authenticate";
private const string ResponseHeaderValue = "Basic";
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
AuthenticationHeaderValue authValue = request.Headers.Authorization;
if (authValue != null && !String.IsNullOrWhiteSpace(authValue.Parameter))
{
Credentials parsedCredentials = ParseAuthorizationHeader(authValue.Parameter);
if (parsedCredentials != null)
{
//Here check the provided credentials against your custom user store
if(parsedCredentials.Username == "Username" && parsedCredentials.Password == "Pass")
{
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(parsedCredentials.Username), null);
}
}
}
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
var response = task.Result;
if (response.StatusCode == HttpStatusCode.Unauthorized
&& !response.Headers.Contains(ResponseHeader))
{
response.Headers.Add(ResponseHeader, ResponseHeaderValue);
}
return response;
});
}
private Credentials ParseAuthorizationHeader(string authHeader)
{
string[] credentials = Encoding.ASCII.GetString(Convert
.FromBase64String(authHeader))
.Split(
new[] { ':' });
return new Credentials()
{
Username = credentials[0],
Password = credentials[1],
};
}
}
public class Credentials
{
public string Username {get;set;}
public string Password {get;set;}
}
然后在全局应用程序配置中应用消息处理程序
protected void Application_Start()
{
GlobalConfiguration.Configuration.MessageHandlers
.Add(new BasicAuthMessageHandler());
}
请注意,提供的示例只是一个示例。