A. 如何使用 Web API 来对 MVC 应用程序进行身份验证
首先,让我们先更新 API 项目
我们将先对 API 项目进行必要的修改,修改完成之后再切换到 Web 项目对客户端进行更新。
第1步:我们需要一个数据库
在能做任何操作之前我们需要先创建一个数据库。本例中将使用 SQL Server Express。如果你没有安装,可以从这里下载 SQL Server Express。安装完成之后,创建一个名为 CallingWebApiFromMvc 的数据库。这就是第一步要做的。
Api 项目还需要一个数据库连接字符串,否则我们寸步难行。把下面这段代码插入到 Api 项目的Web.config 文件中:
<connectionStrings>
<add name="ApiFromMvcConnection" connectionString="Data Source=(local);Initial Catalog=CallingWebApiFromMvc;Integrated Security=True" providerName="System.Data.SqlClient" /></connectionStrings>
认证(Identity)框架会自动创建我们管理用户所需要的成员关系表,现在不需要担心去提前创建它们。
第2步:添加相关的Nuget包
接下来我们添加用于OWIN和Windows认证的Nuget包。打开包管理控制台,切换Api项目为缺省项目,输入以下命令:
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin
使用这些包可以在我们的应用中启动一个OWIN服务器,然后通过EntityFramework把我们的用户保存到SQL Server。
第3步:添加管理用户的Identity类
我们使用基于Windows认证机制之上的Entity框架来管理数据库相关的业务。首先我们需要添加一些用于处理的类。在Api项目里添加一个Identity目录作为我们要添加类的命名空间。然后添加如下的类:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}
注意我们传给基类构造函数的参数ApiFromMvcConnection要和Web.config中的连接字符串中的name相匹配。
public class ApplicationUserManager : UserManager<ApplicationUser>
{ public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore<ApplicationUser> (context.Get<ApplicationDbContext> ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser> (manager)
{
= false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser> (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}
第4步:添加OWIN启动类
为了让我们的应用程序作为OWIN服务器上运行,我们需要在应用程序启动时初始化。我们可以通过一个启动类做到这一点。我们将装点这个类的
OwinStartup属性,因此在应用程序启动时触发。这也意味着,我们可以摆脱的Global.asax和移动它们的
Application_Start代码转换成我们新的启动类。
using Microsoft.Owin;
[assembly: OwinStartup(typeof(Levelnis.Learning.CallingWebApiFromMvc.Api.Startup))]
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager> (ApplicationUserManager.Create); var oAuthOptions = new
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOptions);
}
}
}
在应用程序启动时,我们正在建立自己的服务器。在这里,我们配置令牌端点并设置自己的自定义提供商,我们用我们的用户进行身份验证。在我们的例子中,我们使用了ApplicationOAuthProvider类。让我们来看看现在:
第5步:添加OAuth的提供商
public class ApplicationOAuthProvider :
{ public override Task ValidateClientAuthentication( context)
{
context.Validated();
return Task.FromResult<object> (null);
}
public override async Task GrantResourceOwnerCredentials( context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager> ();
var user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect."); return;
}
var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary<string, string>
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}
我们感兴趣的是这里2种方法。第一,ValidateClientAuthentication,只是验证客户端。我们有一个客户端,所以返回成
功。这是一个异步方法签名但没有异步调用发生。正因为如此,我们可以离开了异步修改,但我们必须返回一个任务自己。我们增加了一个名为
GenerateUserIdentityAsync的ApplicationUser,它看起来像这样的方法:
public class ApplicationUser : IdentityUser
{ public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}
第6步:注册一个新用户 - API端
所以,我们有到位的所有Identity类管理用户。让我们来看看RegisterController,将新用户保存到我们的数据库。它接受一个RegisterApi模式,这是简单的:
public class RegisterApiModel
{
[Required]
[EmailAddress] public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
public string Password {
get; set;
}
[Required]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
控制器本身,如果注册成功只是返回一个200 OK响应。如果验证失败,则返回401错误请求的响应。
public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager<ApplicationUserManager> ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}
B. asp.net webapi 个人身份验证 token
重写AuthorizeAttribute,对你想要禁用的token抛出UnAuthorized
C. 请问html的js调用webapi接口
引用jquery,有很方便的GET调用方法:
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1">
<!--src值为文件位置路径-->
<scripttype="text/javascript"charset="UTF-8"src="javascript/jquery-1.12.1.js"></script>
<title>测试案例</title>
<!--语法:jQuery.getJSON(url,data,success(data,status,xhr))-->
<scripttype="text/javascript"charset="UTF-8">
functiongetToken(){
$.getJSON("http://localhost/kdapi/api/access_token",{"id":111,"secret":2352532},function(result){
alert(result.access_token);
});
}
</script>
</head>
<body>
<buttononclick="getToken()"style="width:120px;height:60px;">获取Token</button>
</body>
</html>
D. C# webapi访问java接口时,后台代码访问返回403错误,使用postMan是可以测试通过的
看你的代码,你是不是POST的时候忘记带上某些参数,如access_token。
403错误是一种禁止访问的错误,你发出的请求被服务器可能由于未经过验证所以请求被服务器拒绝了。
E. webapi中oauth2 获取不到access_token
设置一下请求head里面的属性
F. 桌面程序怎样通过webapi获取json数据
首先要思考下为什么google要开发api呢,因为google的产品用户很多,他们的需求也是各种各样的,打个比方adwords,用户可以下载google adwords editors这样的桌面软件去操作,也可以通过google adwords的界面去操作,但是用户同时也要操作 推广助手,有技术的客户就想 能不能自己开发一款软件 打通这2个产品google adwords和网络推广,同时可以操作,所以api接口就给了这样的可能,这是和同类型产品对接,方便用户统一操作,
还有一个例子,google analytics自定义运用,每周都需要发报告给客户,虽然google analytics有自动报告功能,但是如果有报告固定的格式,每周都是人共去google analytics里面去拉数据 然后填进去的话, 完全可以用web或者客户端的方式自动去取数据,然后填充到模板里面(模板可以通过web方式整合成html代码 再通过api把html代码中的数字替换)再加个发信函数,这样每个星期都可以有一份图文并茂 并且随时调整模板的报告邮件了,同时你甚至可以同时集合ga和adwords Bai的数据这样就省掉大量人工发信的时间。这里api的作用是整合其他信息,一起制作需要的产品,节约时间
未来的社会是开发的社会,只有把产品的接口开放出来,用户安装自己的想法加以利用就可以让产品使用的人更加方便
Google analytics的数据是支持通过api按需导出 甚至你可以制作成email或者整合在你的网站后台中,这些都只是需要api,再开始之前先介绍下
什么是api呢 你可以理解就是通用的函数 可以调用google的服务的数据 例如google analytics数据,
什么是token,token就是一串帐号密码,不过这个是随机变动的,因为在互联网中传输信息,所以最好有一套随机变动的密码来保证信息的安全,
什么是Python,python是一个很简单的程序语言,安装下就可以用就和vb一样 但是他很强壮 据说只要电脑能做的事 他就能做 无所不能 和硬件交互也没问题的
什么是Json 文件 是一种类似txt文件的一种文本文件,这里用来保存机密的信息例如你的帐号密码
什么是Google api library库,电脑安装了python只能说是安装了一个基本的语言环境,你要实现某些功能还需要程序,google把这些可以操作自己服务的基础数据的文件打包成库文件 记住这里的库并不是所以的google的服务的程序都在里面,只是定义了一个基本的接口和传输方法,你要运行google analytics 还是需要定义一些函数来操作的 然后再引用google api的 库文件
什么是客户端 google的 api分多种 你既可以通过web 的应用来获取数据(要绑定运行的网站的域名,主要也是为安全) 也可以通过本地的程序,这里为了演示方法 我用的本地程序,所以我这里的客户端是桌面程序应用
G. 有个足球集锦视频的背景音乐,谁知道呀,求音乐名字。以下为网址
歌的名字叫《With a spirit》
http://..com/question/145710821.html这里有下载地址
H. 用web api 分离前后台 会不会有风险
1、 OAuth是做什么的?
在网上浏览时,大家都见过这样的功能:网站A提供了第三方登录服务,比如使用新浪微博、QQ账户登录。用户使用第三方账户登陆后,第三方返回Token给网站A,当网站A调用第三方服务请求登录用户信息时需传递该Token给第三方,第三方才允许该服务请求。之后的每次请求无需再次认证,直接使用该Token即可。这就是OAuth的典型应用。
2、 简单使用介绍 (具体使用OAuth的方法请参考:在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token)
2.1、用户登录的过程即是获取Token的过程,前端用户登录示例代码如下:
1 $.ajax({
2 type: "POST",
3 url: api_address + "token", //api_address为WebApi服务地址,由于OAuth的使用中设置了属性TokenEndpointPath = new PathString("/token"),所以请求到“token”链接时即可自动进入认证流程。
4 data: { grant_type: "password", username: username, password: password, ran: Math.random() },//传递用户名、密码、认证方式
5 dataType: "json",
6 success: function (result) {
7 if (result.access_token && result.access_token.length > 0) {
8 //result.access_token即是有效的服务调用凭证,可以把该值存入到Cookie中,以备下次使用。
9 callback(1, "登录成功。");
10 }
11 else {
12 callback(0, "未知错误!");
13 }
14 },
15 error: function (XMLHttpRequest, textStatus, errorThrown) {
16 callback(0, XMLHttpRequest.responseJSON.error);
17 }
18 });
登录代码
2.2、当认证方式为password时,已下方法为认证流程中的一步。(认证通过才会返回Token)
1 public override Task GrantResourceOwnerCredentials( context)
2 {
3 var username= context.UserName;
4 var password=context.Password;
5 if(用户名与密码不合法)
6 {
7 context.setError(“用户名或密码错误!”);//认证不通过
8 }
9 else
10 {
11 var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
12 oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
13 //可以加入用户信息及其他必要信息到Token中,以便在api服务中使用(使用中HttpContext.Current.User.Identity即为oAuthIdentity对象,WebApi的Controller中可直接使用User.Identity)。
14 oAuthIdentity.AddClaim(new Claim("UserID", user.UserID.ToString()));
15 var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
16 context.Validated(ticket);//认证通过
17 }
18 return base.GrantResourceOwnerCredentials(context);
19 }
认证代码
3、 已经获取了Token,如何使用?
网上的大部分示例都是使用HttpClient调用的方式,而前后端的完全分离作为一种发展趋势,我们需要Jquery的调用方式。
1 $.ajax({
2 type: “method”,//get,post,put,delete
3 url:api_address + “api/Test”,//如果调用webapi中的TestController
4 data: {data},
5 dataType: "json",
6 headers: {
7 "Authorization": "Bearer " + “token” //把登录获取的Token加入到http请求头中
8 },
9 success: function (result) {
10 callback(result);
11 },
12 error: function (XMLHttpRequest, textStatus, errorThrown) {
13 //。。。。。。
14 }
15 });
调用Api
4、Api的访问权限该如何做?
认证中我们把用户登录成功作为认证通过的标志,但不同角色的用户具有不同的访问权限(个人认为认证中应使用最小权限验证,如示例中的登录成功),如何控制有些Controller不能被低权限用户访问。
1 [Authorize]
2 public class TestController: ApiController
3 {
4 // GET api/<controller>
5 public HttpResponseMessage Get(int appid)
6 {
7 return null;
8 }
9 }
一个典型的ApiController
[Authorize]表示访问该Controller的请求必须经过认证(请求头中具有Token信息),这里我们可以自定义一个特性去验证用户权限,并替换特性AuthorizeAttribute。(这里仅提供思路,具体做法请自己摸索,不保证以下代码的正确性)
1 public class CustomeAuthorizeAttribute:System.Web.Http.AuthorizeAttribute
2 {
3 protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
4 {
5 if(base.IsAuthorized(actionContext))
6 {
7 //这里对用户的权限进行验证,actionContext可以获得请求的是哪一个Controller
8 var user = HttpContext.Current.User.Identity;//Token中带有的用户信息
9 if (可以访问)
10 {
11 return true;
12 }
13 return false;
14 }
15 return false;
16 }
17 }
18
I. enablecors-webapi跨域 为何不能实现有哪些注意事项
上一篇我们介绍了如何使用vue resource处理请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用。 这个应用始终遗留了一个问题,Web App在访问REST API时,没有经过任何认证,这使得服务端的REST API是不安全的,只要有人知道api地址,就可以调用API对服务端的资源进行修改和删除。 今天我们就来探讨一下如何结合Web API来限制资源的访问。 本文的主要内容如下: 介绍传统的Web应用和基于REST服务的Web应用 介绍OAuth认证流程和密码模式 创建一个基于ASP. Identity的Web API应用程序 基于$.ajax实现OAuth的注册、登录、注销和API调用 基于vue-resource实现OAuth的注册、登录、注销和API调用 本文的最终示例是结合上一篇的CURD,本文的登录、注册、注销和API调用功能实现的。 35 本文9个示例的源码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! Page Demo GitHub Source 基于$.ajax的示例如下: 注册示例 登录和注销示例 登录获取token并调用API示例 注册、登录、注销、调用API综合示例 基于vue-resource的示例如下: 注册示例 登录和注销示例 登录获取token并调用API示例 注册、登录...
J. webapi token和basic的区别
web api token是网络编程语言,而Basic是最基本的编程语言。
一、网络编程语言ASP。
ASP即Active Server Pages,是MicroSOft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML(Hyper Text Markup Language,超文本置标语言)网页文件中的服务器端脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和com组件调用。[1-2]
ASP简单、易于维护 , 是小型页面应用程序的选择 ,在使用DCOM (Distributed Component Object Model)和 MTS(Microsoft Transaction Server)的情况下, ASP甚至可以实现中等规模的企业应用程序。[
ASP程序的运行对硬件环境没有特别的要求,通常具备能够满足Windows操作系统运行要求的硬件设备即可。基本内存容量要求为64MB,建议内存容量为128MB或更多。此外,应该有1G以上的硬盘空问用来安装所需的软件。
asp软件环境
在软件环境方面,因为ASP是Microsoft公司推出的,只有在Microsoft Windows操作系统及其配套的web服务器软件的支持下才能运行。MicrosoR公司的各种wiIldows操作系统都可以作为ASP的运行平台。其中,在wiIIdows 98操作系统下运行的Personal w曲Server,一般简称为PWS,而hltcmeIll:folma缸on SeⅣer,则简称为IIS。[5
二、Basic。
BASIC(Beginners' All-purpose Symbolic Instruction Code,又译培基),意思就是“初学者通用符号指令代码”,是一种设计给初学者使用的程序设计语言。BASIC是一种直译式的编程语言,在完成编写后不须经由编译及连结等手续即可执行,但如果需要单独执行时仍然需要将其建立成执行档。
BASIC是由达特茅斯学院院长、匈牙利人约翰·凯梅尼(John G. Kemeny)与数学系教师托马斯·卡茨(Thomas E. Kurtz)共同研制出来的。1964年BASIC语言正式发布。第一个BASIC程序在1964年5月1日早上4时,由BASIC编译程序进行编译后成功运行[1] 。1975年,比尔·盖茨把它移植到PC上。
1998年6月15日,Microsoft公司推出Visual BASIC的第6版(即6.0版本),之后,又推出Visual Basic 6.0中文版[4] 。VB 6.0作为Microsoft Visual Studio 6.0工具套件之一,它提供了图形化、ODBC实现整合资料浏览工具平台,提供了与Oracle和SQL Server的数据库链接工具。VB 6.0的Web开发特性可以使得开发人员以更方便、组件式的方法,开发各种HTML和动态HTML的应用程序。这些新特性,使得VB 6.0成为建立可扩展的企业应用开发平台的理想选择[6] 。Microsoft公司总裁比尔·盖茨宣称:“Visual BASIC是迎接计算机程序设计挑战的最好例子”[4] 。
2001年,VB.NET发布。由于使用了新的核心和特性,很多VB的程序员都要改写程序。2005年11月7日,VB.NET 2005(v8.0)发布。它可以直接设计出Windows XP风格的界面,但是其编写的程序占用内存较多。2010年4月,VB.NET 2010(v10.0)发布[6] 。
Visual BASIC属于第四代BASIC,第四代BASIC的特点是:提供图形界面取代过去的字符界面,是“for Windows”的软件[4] 。