Authenticating ASP.NET Web API

10 浏览
0 Comments

Authenticating ASP.NET Web API

我已创建了一个新的ASP.NET Web API,目前一切正常。现在我想保护这个API。

我在基本控制器上方添加了[Authorize]属性,如果我想在ASP.NET应用程序内部进行API调用,它能正常工作。

然而,我想知道对于想要进行API调用并绕过授权的外部客户端,最佳实践是什么?同时,要考虑到我有自定义认证逻辑。

客户端应该如何发送凭据?我在何处处理这些凭据?

0
0 Comments

认证ASP.NET Web API的出现问题是因为希望通过加密的方式将用户名和密码发送到服务器端,然后让API生成一个随机的会话ID并保存在服务器端的列表中,然后将该ID发送回客户端。每当客户端向服务器发送请求时,都在数据包中包含接收到的ID,服务器可以每次都进行验证。当客户端断开连接或超时时,可以从服务器列表中删除该ID,并要求客户端重新进行身份验证。

关于客户端如何将会话ID传递回服务器端,取决于应用程序的构建方式和所使用的协议。例如,如果只是一个使用telnet的应用程序,在socketstream中发送和接收字符串,可以将ID作为字符串消息的第一个参数。客户端只需记住服务器返回的ID,并将其用作验证凭据直到断开连接。

这是一个使用ASP.NET的全部内部基础设施的ASP.NET Web API。请求仅通过HTTP接受。

为API避免在网络上发送用户名和密码,最好使用共享密钥和签名进行认证。

以下是ASP.NET Web API的身份验证示例代码:

// 配置Web API身份验证
public static void Register(HttpConfiguration config)
{
    // 允许匿名访问的路由
    config.Routes.MapHttpRoute(
        name: "Default",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    // 配置身份验证
    config.Filters.Add(new CustomAuthorizationFilter());
}
// 自定义身份验证过滤器
public class CustomAuthorizationFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        // 从请求头中获取会话ID
        var sessionId = actionContext.Request.Headers.GetValues("SessionId").FirstOrDefault();
        // 验证会话ID是否有效
        if (!IsValidSession(sessionId))
        {
            // 返回未授权的响应
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        }
        base.OnAuthorization(actionContext);
    }
    private bool IsValidSession(string sessionId)
    {
        // 在服务器端验证会话ID的有效性
        // 返回会话ID是否有效的布尔值
    }
}

通过将上述代码添加到Web API项目中,可以实现对请求的身份验证。客户端需要在请求头中包含名为“SessionId”的会话ID。

希望这篇文章能对你理解ASP.NET Web API的身份验证有所帮助。

0
0 Comments

认证ASP.NET Web API的问题是如何发送客户端凭据以及在何处处理这些凭据。默认的发送认证信息的位置是授权头部,在这里可以使用基本认证和其他类型的认证(JWT、Bearer等)。要添加基本认证头部到请求中,可以在客户端使用以下代码:

WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl");
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));

在请求的范围内,我会编写一个DelegatingHandler并使用它来解析“Principal”。然后,可以将其设置为HttpContext.CurrentPrincipal,以便在需要的任何地方都可以使用它。DelegatingHandler在控制器之前被调用,这使其非常适合用于认证逻辑。

客户端也可以使用DelegatingHandler或ActionFilterAttribute的方式添加认证头部。请注意,DelegatingHandler属于HTTP管道,而ActionFilterAttribute属于MVC管道。

最后,我建议不要编写自己的自定义认证逻辑,而是使用默认的框架。这可以简单地使用基本认证通过HTTPS或者复杂地实现OAuth。但是我建议远离自己编写的解决方案。

如果想要使用OAuth,需要创建一个单独的OAuth服务,它会在客户端进行API调用之前创建某种类型的令牌。至于在ASP.NET Web API中使用OAuth的简单示例,可以参考ThinkTectures IdentityServer和DotNetOpenAuth。

总之,认证ASP.NET Web API的问题是如何发送客户端凭据和在何处处理这些凭据。解决方案是在授权头部发送认证信息,并使用DelegatingHandler在请求的范围内处理凭据。此外,建议使用默认的认证框架,而不是编写自定义的认证逻辑。如果需要使用OAuth,可以创建一个单独的OAuth服务或使用ThinkTectures IdentityServer和DotNetOpenAuth。

0