C# 如何向现有用户的ASP.NETWebAPI添加身份验证? 我将用户存储在我们自己的自定义数据库中 我开发了一个ASP.NETWeb2API 我没有现有的网站,客户端没有使用浏览器(因此无法使用表单身份验证) 我需要使用现有用户,因此无法使用ASP.NET的标识,而该标识使用它自己的表

C# 如何向现有用户的ASP.NETWebAPI添加身份验证? 我将用户存储在我们自己的自定义数据库中 我开发了一个ASP.NETWeb2API 我没有现有的网站,客户端没有使用浏览器(因此无法使用表单身份验证) 我需要使用现有用户,因此无法使用ASP.NET的标识,而该标识使用它自己的表,c#,authentication,asp.net-web-api,.net-4.5,C#,Authentication,Asp.net Web Api,.net 4.5,如何最好地将身份验证添加到API中?我想利用现有的基础设施,如Authorize属性 (此问题:没有回答我的问题,因为它建议的身份验证只有两种方式:表单身份验证和Windows集成身份验证,我都不能使用这两种方式)。我喜欢在消息处理程序中使用自定义身份验证机制。因为我不知道关于安全级别的要求,所以不可能说应该使用哪种机制。如果您使用的是SSL,那么就足够了 使用自定义用户存储进行基本身份验证的简单处理程序如下所示: public class BasicAuthMessageHandler : D

如何最好地将身份验证添加到API中?我想利用现有的基础设施,如
Authorize
属性


(此问题:没有回答我的问题,因为它建议的身份验证只有两种方式:表单身份验证和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;}
}

请注意,提供的示例只是一个示例

您可以根据任何条件在web api上设置授权,但是如果您没有浏览器,您打算如何保留身份验证?需要发送cookie或ouath令牌,以便api知道请求是合法的并经过身份验证的?我没有浏览器,但它是HTTP,因此我可以在标头中包含令牌,即使我没有使用HTTP,我也可以将它包含在我的请求中。在头中包含它发送的cookie更容易,除非你知道如何配置Ouath?但是如果没有浏览器,hmmm ouath可能是您唯一的选择使用//执行一些条件检查,然后设置FormsAuthentication.SetAuthCookie(userAccount,true);//如果不想创建持久cookie,则将其设置为false,如果将cookie包含在标头中,则该cookie应该可以工作
protected void Application_Start()
    {
        GlobalConfiguration.Configuration.MessageHandlers
          .Add(new BasicAuthMessageHandler());
    }