Asp.net mvc 使用ASP.NET Web API进行跨平台身份验证
我如何开始使用ASP.NET Web API编写身份验证代码,使其能够跨平台支持桌面、移动和Web?我读过一些进行RESTful身份验证的方法,比如在头中使用令牌 有没有使用这种方法的示例项目 问题:Asp.net mvc 使用ASP.NET Web API进行跨平台身份验证,asp.net-mvc,rest,asp.net-web-api,Asp.net Mvc,Rest,Asp.net Web Api,我如何开始使用ASP.NET Web API编写身份验证代码,使其能够跨平台支持桌面、移动和Web?我读过一些进行RESTful身份验证的方法,比如在头中使用令牌 有没有使用这种方法的示例项目 问题: 如果没有,如何修复[Authorize]属性以读取令牌 如何生成此令牌?我认为我不能使用formsauthentication,因为它使用cookies 我如何处理实际授权,客户机是否发送原始密码和用户名,然后我生成令牌,或者是否有其他方法 当我的网站正在使用它时,我该如何处理?我听说这与应用程序
[Authorize]
属性以读取令牌李>
有很多方法可以对REST服务的用户进行身份验证。使用代币是可能的,但仅仅使用代币就更简单了,并且尽可能地标准化和跨平台 别把它和你的名字混淆了。[Authorize]属性完全是关于授权的,但只有在使用其他机制对用户进行身份验证之后。如果不先进行适当的身份验证,授权是完全无用的
检查的最佳资源是谁是这方面的专家。我认为代币将是一个可靠的方法。表单身份验证基于用于web的Cookie。不过,这并不是所有非浏览器客户端最理想的情况 我建议创建一个自定义AuthorizationFilterAttribute并重写OnAuthorization方法。在该方法中,您可以检查是否存在在客户机提供有效凭据后向其颁发的令牌。您可以在任何要验证的方法或控制器上使用此属性。这是一个你可以参考的例子
public class AuthorizeTokenAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext != null)
{
if (!AuthorizeRequest(actionContext.ControllerContext.Request))
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request };
}
return;
}
}
private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
{
bool authorized = false;
if (request.Headers.Contains(Constants.TOKEN_HEADER))
{
var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
if (tokenValue.Count() == 1) {
var value = tokenValue.FirstOrDefault();
//Token validation logic here
//set authorized variable accordingly
}
}
return authorized;
} }
TOKEN_HEADER只是一个字符串,表示客户端应传回用于身份验证请求的HTTP头
那么让我们来看看
另外,请查看约翰·彼得森的这篇文章 我使用一种非常简单的方法:
使用新ASP.NET MVC web API的这种方法的服务可以服务于任何类型的客户端:浏览器/javascript和本机(桌面或移动)等。U可以使用ActionFilterAttribute并覆盖OnActionExecuting方法。 稍后,在global.cs中注册此筛选器,以便将此筛选器应用于应用程序启动方法中的所有类似操作 var config=GlobalConfiguration.Configuration; 添加(新的CustomAuthAttribute()) { 命名空间自定义 { 公共类CustomAuthAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// To inforce HTTPS if desired , else comment out the code
if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("HTTPS Required")
};
return;
}
// get toekn from the header
var userToken = actionContext.Request.Headers.GetValues("UserToken");
// Customer Logic to check the validity of the token.
// U can have some DB logic to check , custom STS behind or some loca cache used to compare the values
}
}
}
}对于基本身份验证,这是执行此操作的方法是。使用HTTPS,因为编码仅为base64,而不是加密。Dominick Baier文章的链接是BrokenTanks,这很有帮助,您建议如何在身份验证期间生成令牌?生成guid并将其存储在数据库中?我想这取决于您。您可以使用Guid、哈希或某种类型的唯一值。取决于什么对你的应用程序真正有意义在你的代码注释中你说“相应地设置授权变量”…授权变量将设置在哪里?根据请求。属性?在其他地方?也可以查看John Petersen更新的帖子,他使用Http消息处理程序而不是操作过滤器。API应该有一些端点,允许身份验证/授权工作流。就像你有一个网站的登录页面,你可以考虑比MD5更强大的东西。在这一点上,它可以很快被破解,想想几分钟或几小时。您应该使用更强的散列,比如SHA256/512,或者最好是计算速度较慢的,比如bCrypt。这是一些有用的信息@EBarr(I+1'd you),但我认为在这种情况下,他使用MD5是安全的,因为他加密的内容对于彩虹表来说太大太模糊了。@Grinn rainbow tables是如此2005;-)。当然,md5可能做到了。然而,如今在一个强大的GPU上,Md5可以在几分钟内被强制使用。例如,一个amazon ec2 GPU盒只需几美元。@EBarr:我没有意识到这一点。谢谢