ASP.NET Web API 通过Authentication特性来实现身份认证
2016-01-08 18:11
766 查看
using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Security.Principal; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.Http.Filters; using System.Web.Http.Results; namespace WebApi { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class AuthenticateAttribute : FilterAttribute, IAuthenticationFilter { private static readonly Dictionary<string, string> UserAccounts; static AuthenticateAttribute() { UserAccounts = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { {"Foo", "Password"}, {"Bar", "Password"}, {"Baz", "Password"} }; } public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) { IPrincipal user = null; var headerValue = context.Request.Headers.Authorization; if (null != headerValue && headerValue.Scheme == "Basic") { var credential = Encoding.Default.GetString(Convert.FromBase64String(headerValue.Parameter)); var split = credential.Split(':'); if (split.Length == 2) { var userName = split[0]; string password; if (UserAccounts.TryGetValue(userName, out password)) { if (password == split[1]) { var identity = new GenericIdentity(userName); user = new GenericPrincipal(identity, new string[0]); } } } } context.Principal = user; return Task.FromResult<object>(null); } public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { var user = context.ActionContext.ControllerContext.RequestContext.Principal; if (null != user && user.Identity.IsAuthenticated) return Task.FromResult<object>(null); var parameter = $"realm={context.Request.RequestUri.DnsSafeHost}"; var challenge = new AuthenticationHeaderValue("Basic", parameter); context.Result = new UnauthorizedResult(new[] {challenge}, context.Request); return Task.FromResult<object>(null); } } }
相关文章推荐
- 在ASP.NET中引用自定义提示框
- 【ASP.NET】利用UpdatePanel、ScriptManager、Timer完成定时局部更新
- asp.net开发中常用的sql server数据库操作封装类
- asp.net的URL重写
- 【ASP.NET】利用UpdatePanel与ScriptManager完成局部的更新
- Sql server 2005安装时 找不到 ASP.Net 在 Microsoft Internet 信息服务(IIS)中的版本注册信息。
- jasperreport 导出excel xlsx格式、word docx格式
- aspx导出到excel 无中文乱码问题
- 理解ASP.NET 5运行时命令:DNVM, DNX, 和DNU
- 修改Raspbian软件源以加快软件下载速度
- (转载)GRASP职责分配原则
- net 自带的邮件发送功能封装-charp asp.net
- 【ASP.NET】Win7下ASP.NET的配置,Helloworld,发布网站
- Asp.Net MVC如何返回401响应码
- 【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3
- ASP.NET MVC 5 01 - ASP.NET概述
- jasperreport 第一次导出会很慢的原因
- ASP.NET - SqlSugar ORM框架 更新列表
- 让ASP.NET Web API支持text/plain内容协商