Web API 基于ASP.NET Identity的Basic Authentication

  今天给大家分享在Web API下,如何利用ASP.NET Identity实现基本认证(Basic Authentication),在博客园子搜索了一圈Web API的基本认证,基本都是做的Forms认证,很少有Claims认证(声明式认证),而我们在用ASP.NET Identity实现登录,认证,授权的时候采用的是Claims认证。

  在Web API2.0中认证接口为IAuthenticationFilter,我们只需实现该接口就行。创建BasicAuthenticationAttribute抽象基类,实现IAuthenticationFilter接口:

 1 public abstract class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter
 2     {
 3         protected abstract Task<IPrincipal> AuthenticateAsync(string userName, string password, HttpAuthenticationContext context,
 4             CancellationToken cancellationToken);
 5         public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
 6         {
 7             context.Principal = null;
 8             AuthenticationHeaderValue authenticationHeader = context.Request.Headers.Authorization;
 9             if (authenticationHeader != null && authenticationHeader.Scheme == "Basic")
10             {
11                 if (!string.IsNullOrEmpty(authenticationHeader.Parameter))
12                 {
13                     Tuple<string, string> data = GetUserNameAndPassword(authenticationHeader.Parameter);
14                     context.Principal = await AuthenticateAsync(data.Item1, data.Item2,context, cancellationToken);
15                 }
16             }
17
18             if (context.Principal == null)
19             {
20                 context.ErrorResult = new UnauthorizedResult(new[] {new AuthenticationHeaderValue("Basic")},
21                     context.Request);
22             }
23         }
24         public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
25         {
26             return Task.FromResult(0);
27         }
28         public bool AllowMultiple
29         {
30             get { return false; }
31         }
32         private Tuple<string, string> GetUserNameAndPassword(string authenticationParameter)
33         {
34             if (!string.IsNullOrEmpty(authenticationParameter))
35             {
36                 var data = Encoding.ASCII.GetString(Convert.FromBase64String(authenticationParameter)).Split(‘:‘);
37                 return new Tuple<string, string>(data[0], data[1]);
38             }
39             return null;
40         }
41     }

其中Task<IPrincipal> AuthenticateAsync(string userName, string password, HttpAuthenticationContext context, CancellationToken cancellationToken)方法为抽象方法,用户可以重载实现自己的认证方式,Forms认证,Windows认证,Claims认证等等都可以。

AuthenticationHeaderValue authenticationHeader= context.Request.Headers.Authorization用于获取HTTP请求头部的认证信息。

authenticationHeader.Scheme == "Basic"用于指定认证模式为基本认证。

authenticationHeader.Parameter用户获取用户加密过后的用户名和密码。

如果认证不为空,且是Basic认证,头部参数不为空,则调用认证的具体代码,如果认证不通过,则调用HTTP认证上下文的ErroResult属性:

context.ErrorResult = new UnauthorizedResult(new[] {new AuthenticationHeaderValue("Basic")},context.Request);设置了该属性,浏览器则自动弹出用户登录的窗口。要想浏览器自动弹出登录窗口,必须在WebApiConfig配置类中指定令牌身份验证,即调用如下代码:config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));否则无法弹出登录窗体。

Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)方法在认证通过成功和失败后都会调用此方法,你可以在这里实现自己想要的逻辑,比如设置context.ErrorResult属性,在这里就不做处理了,因为AuthenticateAsync方法已经做了处理了。

GetUserNameAndPassword方法用于处理加密过后的用户名和密码。

接下来就是实现自己的认证逻辑了,这里采用Asp.net Identity的Claims认证。

 1  public class IdentityBasicAuthenticationAttribute : BasicAuthenticationAttribute
 2     {
 3         protected override async Task<IPrincipal> AuthenticateAsync(string userName, string password,
 4             HttpAuthenticationContext context, CancellationToken cancellationToken)
 5         {
 6             IPrincipal principal = null;
 7             var userManager = context.Request.GetOwinContext().GetUserManager<AppUserManager>();
 8             var user = await userManager.FindAsync(userName, password);
 9             if (user != null)
10             {
11                 ClaimsIdentity identity =
12                     await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
13                 ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity);
14                 principal = claimsPrincipal;
15             }
16             return principal;
17         }
18     }

var userManager = context.Request.GetOwinContext().GetUserManager<AppUserManager>()用于当前的用户管理器,用户的增删改查操作都依赖于此对象。

var user = await userManager.FindAsync(userName, password)用户根据用户名和密码找到用户。

ClaimsIdentity identity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie)创建用户,然后 通过ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(identity)创建声明,并且返回认证类型。

至于如何创建UserManager,如何通过Entityframwork来生成Asp.net Identity用户,角色和认证相关表,这里就不多说了,园子里面多的去了。

记得在登录代码中把用户名和密码加密后放到Cookie中,登陆后,在访问某个需要认证的Action时候记得在HTTP请求头部中写入Cookie信息,这样认证的Filter才能取到用户信息,登录创建Cookie代码片段如下:

            CookieHeaderValue cookie = new CookieHeaderValue("userToken", authorization)
                    {
                        Path = "/",
                        Domain = Request.RequestUri.Host,
                        Expires = DateTimeOffset.Now.AddDays(7)
                    };
                    responseMessage.Headers.AddCookies(new[] {cookie});

客户短AJax调用需要验证的Action方法如下:

    function ajaxOp(url, type, data) {
        $.ajax({
            url: url,
            type: type,
            data: data,
            beforeSend: function(xhr) {
                xhr.setRequestHeader(‘Authorization‘, ‘Basic ‘ + $.cookie("userToken"));
            }
        });
    }

其中  beforeSend: function(xhr) {xhr.setRequestHeader(‘Authorization‘, ‘Basic ‘ + $.cookie("userToken"))属性设置用于获取Cookie信息放到请求头部。

需要调用的Action记得加上  [IdentityBasicAuthentication]特性。

好了,就到这里吧。

时间: 2024-10-26 00:35:52

Web API 基于ASP.NET Identity的Basic Authentication的相关文章

ASP.NET Web API基于OData的增删改查,以及处理实体间关系

本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } [ForeignKey("Sup

Designing Evolvable Web API with ASP.NET 随便读,随便记 “The Internet,the World Wide Web,and HTTP”——HTTP

HTTP 我们将只聚焦在于与创建 Web APIs有关的部分. HTTP 是信息系统中的一个应用层协议,是Web的支柱. 其原先由 Berners-Lee, Roy Fielding 和 Henrik Frystyk Nielsen 三位计算机科学家们创作的.HTTP 为 客户端与服务器端之间跨网络相互传输信息定义了一个接口.它隐藏了双方的实现细 节. HTTP 设计用来戏剧性地改变系统,而容许一定程度上的延迟和数据的过时. 这种设计允许 计算机中间媒体,如代理服务器来协调通信,提供诸多好处,

Using MongoDB with Web API and ASP.NET Core

MongoDB is a NoSQL document-oriented database that allows you to define JSON based documents which are schema independent. The schema can be mapped with Tables in a Relational Database. A schema in MongoDB is called as collection, and a record in thi

Asp.Net Web API VS Asp.Net MVC

http://www.dotnet-tricks.com/Tutorial/webapi/Y95G050413-Difference-between-ASP.NET-MVC-and-ASP.NET-Web-API.html Asp.Net MVC is used to create web applications that returns both views and data but Asp.Net Web API is used to create full blown HTTP serv

Designing Evolvable Web API with ASP.NET 随便读,随便记 &ldquo;The Internet,the World Wide Web,and HTTP&rdquo;

1982年,诞生了 Internet; 1989年,诞生了World Wide Web . "World Wide Web"的构造为主要由 三部分构成: resources 资源 URIs 统一资源标识符 representations  呈现 其中,资源并不特指数据库之类的.任何东西可以是资源. URIs 分为两类: URLs 和URNs . URL 具有标识,并定位资源的功能. URN 则只是起标识作用. 通常讲,URI 默认指的是 URL. Google 建议,不要对实施了缓存的

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源.关于JWT的技术,可参考网络上文章,这里不作详细说明, 这篇博文,主要说明在asp.net core 2.0中,基于jwt的web api的权限设置,即在asp.net core中怎么用JWT,再次就是不同用户或角色因为权限问题,即使援用Token,也不能访问不该访

在ASP.NET Web API和ASP.NET Web MVC中使用Ninject

先附上源码下载地址 一.准备工作 1.新建一个名为MvcDemo的空解决方案 2.新建一个名为MvcDemo.WebUI的空MVC应用程序 3.使用NuGet安装Ninject库 二.在ASP.NET MVC中使用Ninject 1.新建一个Product实体类,代码如下: public class Product { public int ProductId { get; set ; } public string Name { get; set ; } public string Descr

Web Api和Asp.Net mvc post请求区别

这是mvc的,mvc的post请求可以这样写参数,但是web api的不行.而且content_type:"application/json" 必须要写 下面这是web api的:content_type:"application/json" 必须要写

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tutorial-building-asp-net-