Asp.net web api ASP.net Web API RESTful Web服务&x2B;基本身份验证

Asp.net web api ASP.net Web API RESTful Web服务&x2B;基本身份验证,asp.net-web-api,basic-authentication,restful-authentication,Asp.net Web Api,Basic Authentication,Restful Authentication,我正在使用ASP.NETWebAPI实现一个RESTfulWeb服务。我已经决定使用基本身份验证+SSL来完成身份验证部分。实现这一点的最佳/正确方法是什么 我的第一次尝试是手动执行,解析授权头,根据我的数据库对用户进行解码和验证。这很有效,但我想知道我是否遗漏了什么 我见过一些使用用户角色和主体的解决方案。虽然我不确定它们到底做了什么,但我几乎可以肯定我不会需要它们,因为在我的数据库中,我定义了自己的用户及其角色 我还没有完全理解的是,服务的使用者是否必须随每个请求一起发送凭据,或者它们以某种

我正在使用ASP.NETWebAPI实现一个RESTfulWeb服务。我已经决定使用基本身份验证+SSL来完成身份验证部分。实现这一点的最佳/正确方法是什么

我的第一次尝试是手动执行,解析授权头,根据我的数据库对用户进行解码和验证。这很有效,但我想知道我是否遗漏了什么

我见过一些使用用户角色和主体的解决方案。虽然我不确定它们到底做了什么,但我几乎可以肯定我不会需要它们,因为在我的数据库中,我定义了自己的用户及其角色

我还没有完全理解的是,服务的使用者是否必须随每个请求一起发送凭据,或者它们以某种方式被缓存。我的服务应该做些什么来实现这一点,还是完全由消费者来处理


最后一个问题是关于客户端使用javascript发出请求。如果他们尝试使用该服务,是否会出现任何“跨域请求”问题?

请在此查看一个良好的基本身份验证实现

更多信息请访问:

Jamie Kurtze对在此处使用基本身份验证提供了很好的解释

根据我的理解,如果您希望您的请求是无状态的,那么每个请求都需要设置身份验证字段


Jamie Kurtze将必要的代码封装在从DelegateHandler派生的类中,而Rick Strahl使用过滤器检查调用是否有效。您可以在他的博客上阅读更多关于此主题的文章,网址为

通过向相应的控制器/方法添加
[BasicHttpAuthorize]
属性,对初始(登录)请求使用基本身份验证。如果需要,使用属性指定和。将
BasicHttpAuthorizeAttribute
定义为如下所示的专用属性:

公共类BasicHttpAuthorizeAttribute:AuthorizeAttribute
{
受保护的覆盖布尔已授权(HttpActionContext actionContext)
{
如果(Thread.CurrentPrincipal.Identity.Name.Length==0){//如果尚未通过其他方式建立标识:
AuthenticationHeaderValue auth=actionContext.Request.Headers.Authorization;
if(string.Compare(auth.Scheme,“Basic”,StringComparison.OrdinalIgnoreCase)==0){
字符串凭据=UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
int separatorIndex=credentials.IndexOf(“:”);
如果(分隔索引>=0){
字符串用户名=凭据。子字符串(0,分隔索引);
字符串密码=凭据.Substring(separatorIndex+1);
if(Membership.ValidateUser(用户名、密码))
Thread.CurrentPrincipal=actionContext.ControllerContext.RequestContext.Principal=new GenericPrincipal(new GenericEntity(用户名,“Basic”)、System.Web.Security.Roles.Provider.GetRolesForUser(用户名));
}
}
}
返回base.IsAuthorized(actionContext);
}
}

让初始响应包含用户的API密钥。使用API键进行后续调用。这样,即使用户更改用户名或密码,客户端的身份验证仍然有效。但是,在更改密码时,请为用户提供“断开客户端连接”的选项,您可以通过删除服务器上的API密钥来实现该选项。

这些链接并不能真正回答我的问题。可能只有第一个问题,但它们指的是配置第三方安全库。因为时间不够,我想避免使用更多的库。您好,当我写这个问题时,我不清楚主体和角色是如何使用的(以及它们如何与我自己的用户相关)。我现在要做的是使用身份验证头传递凭据,并使用Http模块统一检查凭据。不过,我会在有时间的时候看看你的链接。我的实现现在运行得很好,但这些链接对未来的读者来说是很好的。你的第一个链接ASP.NET Web Api REST安全基础已失效。我已经解决了这个问题,但感谢你的回答。我发现在所有API调用中,在授权标题中传递用户名和密码比使用您建议的令牌方法更容易。@Edward非常感谢您的帖子,我觉得它非常有帮助。在本例中,您使用的是什么用户和角色机制?因为我看到你创建了一个新的通用原则。您能详细说明我是如何将您的解决方案集成到新的空web api项目中的吗。@Zapnologica此代码使用Microsoft在VS2013之前使用的旧成员身份模型。VS2013的模板使用新的基于OWIN的身份系统,该系统进行自定义用户名/密码身份验证,然后使用承载令牌,从而消除了对BasicHttpAuthorize的需要。@EdwardBrey,Eish ok。哈哈,这让我有点不知所措,你能给我指出正确的方向吗?我需要上面的例子,但是使用owin变体。@Zapnologica抱歉,但我不知道hand,因为我不需要使用owin的这种方法。快速搜索显示,其中提到了
Request.GetOwinContext
,以获取可以调用
Authentication.User
的上下文。也许答案就在这个方向。