ASP.NET Web API Basic Identity 中的基本身份验证
缺点
- 用户凭证在请求中发送。
- 凭据作为明文发送。
- 每个请求都会发送凭据。
- 无法注销,除非结束浏览器会话。
- 易于跨站点请求伪造(CSRF); 需要反CSRF措施。
优点
- 互联网标准。
- 受所有主要浏览器支持。
- 相对简单的协议。
基本认证的工作原理如下:
- 如果请求需要认证,则服务器返回401(未授权)。响应包括WWW-Authenticate头,指示服务器支持基本身份验证。
- 客户端发送另一个请求,其中的客户端凭证位于授权头中。凭据的格式为字符串“name:password”,base64编码。凭证未加密。
基本认证在“领域”的上下文中执行。服务器包括WWW-Authenticate头中的领域名称。用户的凭据在该领域内有效。领域的确切范围由服务器定义。例如,您可以定义多个领域以分区资源。

因为凭据是未加密发送的,所以基本身份验证仅通过HTTPS安全。请参阅在Web API中使用SSL。
基本认证也容易受到CSRF攻击。在用户输入凭据后,浏览器会在会话持续期间自动将它们发送到同一域的后续请求。这包括AJAX请求。请参阅防止跨站点请求伪造(CSRF)攻击。
使用IIS的基本身份验证
IIS支持基本身份验证,但是有一个警告:用户根据其Windows凭据进行身份验证。这意味着用户必须在服务器的域上有一个帐户。对于面向公众的网站,通常需要对ASP.NET成员资格提供程序进行身份验证。1
要使用IIS启用基本身份验证,请在ASP.NET项目的Web.config中将身份验证模式设置为“Windows”:
<system.web>
<authentication mode="Windows" />
</system.web>
在此模式下,IIS使用Windows凭据进行身份验证。此外,您必须在IIS中启用基本身份验证。在IIS管理器中,转到功能视图,选择验证,然后启用基本验证。

在Web API项目中,[Authorize]为需要验证的任何控制器操作添加属性。
客户端通过在请求中设置Authorization头来验证自身。浏览器客户端自动执行此步骤。非浏览器客户端将需要设置标头。
使用自定义成员资格的基本身份验证
如上所述,IIS内置的基本身份验证使用Windows凭据。这意味着您需要在托管服务器上为您的用户创建帐户。但对于互联网应用程序,用户帐户通常存储在外部数据库中。
以下代码如何执行基本身份验证的HTTP模块。您可以通过替换CheckPassword方法来轻松插入ASP.NET成员资格提供程序,该方法在本示例中是一个虚拟方法。
在Web API 2中,应考虑编写身份验证过滤器或OWIN中间件,而不是HTTP模块。
namespace WebHostBasicAuth.Modules
{
public class BasicAuthHttpModule : IHttpModule
{
private const string Realm = "My Realm";
public void Init(HttpApplication context)
{
// Register event handlers
context.AuthenticateRequest += OnApplicationAuthenticateRequest;
context.EndRequest += OnApplicationEndRequest;
}
private static void SetPrincipal(IPrincipal principal)
{
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
}
// TODO: Here is where you would validate the username and password.
private static bool CheckPassword(string username, string password)
{
return username == "user" && password == "password";
}
private static void AuthenticateUser(string credentials)
{
try
{
var encoding = Encoding.GetEncoding("iso-8859-1");
credentials = encoding.GetString(Convert.FromBase64String(credentials));
int separator = credentials.IndexOf(':');
string name = credentials.Substring(0, separator);
string password = credentials.Substring(separator + 1);
if (CheckPassword(name, password))
{
var identity = new GenericIdentity(name);
SetPrincipal(new GenericPrincipal(identity, null));
}
else
{
// Invalid username or password.
HttpContext.Current.Response.StatusCode = 401;
}
}
catch (FormatException)
{
// Credentials were not formatted correctly.
HttpContext.Current.Response.StatusCode = 401;
}
}
private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
{
var request = HttpContext.Current.Request;
var authHeader = request.Headers["Authorization"];
if (authHeader != null)
{
var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
// RFC 2617 sec 1.2, "scheme" name is case-insensitive
if (authHeaderVal.Scheme.Equals("basic",
StringComparison.OrdinalIgnoreCase) &&
authHeaderVal.Parameter != null)
{
AuthenticateUser(authHeaderVal.Parameter);
}
}
}
// If the request was unauthorized, add the WWW-Authenticate header
// to the response.
private static void OnApplicationEndRequest(object sender, EventArgs e)
{
var response = HttpContext.Current.Response;
if (response.StatusCode == 401)
{
response.Headers.Add("WWW-Authenticate",
string.Format("Basic realm=\"{0}\"", Realm));
}
}
public void Dispose()
{
}
}
}
要启用HTTP模块,添加以下在你的web.config文件system.webServer部分:+
<system.webServer>
<modules>
<add name="BasicAuthHttpModule"
type="WebHostBasicAuth.Modules.BasicAuthHttpModule, YourAssemblyName"/>
</modules>
将“YourAssemblyName”替换为程序集的名称(不包括“dll”扩展名)。
您应该禁用其他身份验证方案,例如Forms或Windows身份验证。
ASP.NET Web API Basic Identity 中的基本身份验证的更多相关文章
- Implement JSON Web Tokens Authentication in ASP.NET Web API and Identity 2.1 Part 3 (by TAISEER)
http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-an ...
- ASP.NET Web API 通过Authentication特性来实现身份认证
using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Security ...
- ASP.NET Web API身份验证和授权
英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...
- ASP.NET Web API 路由对象介绍
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- 简话ASP.NET Web API
简话ASP.NET Web API 在vs2012中,我们很容易在根据选择的ASP.NET MVC Web应用程序来新建一个Web API应用,聪明的你一定想见得到,Web API和MVC有着某种联系 ...
- ASP.NET Web API框架揭秘:路由系统的几个核心类型
ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...
- asp.net web api 跨域问题
缘起 以前在asp.net mvc时代,很少出现跨域问题 自从使用了asp.net web api + angular (1/2)之后,开始有跨域问题了. 简单普及下跨域: 我的理解是只要是前台页面与 ...
随机推荐
- 对称与非对称加密;SSL;HTTPS;AJP
1.对称加密就是加密与解密的时候都是用一个密码 2.非对称加密,有一对密码A,B:用A加密就得用B解密,相对的用B加密就得用A解密 3.公钥与私钥,这一对密码,随便拿一个公布出去,那个就是公钥,剩下一 ...
- arm汇编之 bne与beq
在网上看了一些bne和beq的区别,但是对于初学者来说,容易越看越糊涂,因此简单介绍下: 我们先分析CPSR寄存器的Z标识位: cmp指令可以直接影响CPSR寄存器的Z标识位(条件位),从图中可以看出 ...
- Node+GitLab实现小程序CI系统
为什么要实现自动部署 小程序开发迭代里,有以下几个个头痛的问题, 如何准确并快速的的把小程序上传去后台,并让测试人员进行测试? 测试同事找开发要二维码,效率较低 本地生成的二维码会出现携带本地代码.未 ...
- 避免使用HttpClient的系统代理
这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下Htt ...
- Python Revisited Day 02 (数据类型)
目录 Python 关键字 整数 整数转换函数 整数位逻辑操作符 浮点类型 math模块函数与常量 复数 精确的十进制数字 decimal 字符串 str.format() 格式规约 Python 关 ...
- session与cookie的区别以及HTML5中WebStorage理解
一.session与cookie的区别 二.HTML5中WebStorage理解 WebStorage的目的是克服由cookie所带来的一些限制,当数据需要被严格控制在客户端时,不需要持续的将数据发回 ...
- 使用faker去构造一个User-Agent
faker可以仿造各种各样的信息,可以使用faker去构造一个User-Agent from faker import Factory f = Factory.create() 'User-Agent ...
- PAT 7-14 公路村村通
https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957 现有村落间道路的统计数据表中,列出了有可 ...
- 开发神器之phpstorm破解与日常使用
PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. PhpStorm可随时帮助用 ...
- react-router的坑
componentWillReceiveProps(nextProps){ 在改钩子函数里接受组件变化的最近的传递的props 如果在这里没有使用nextprops 而是调用this.props 会出 ...