如何使用 Web API 来对 MVC 应用程序进行身份验证

如何使用 Web API 来对 MVC 应用程序进行身份验证,第1张

首先,让我们先更新 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=CallingWebApiFromMvcIntegrated 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)

{

AllowOnlyAlphanumericUserNames = 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 OAuthAuthorizationServerOptions

{

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 : OAuthAuthorizationServerProvider

{public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

{

context.Validated()

return Task.FromResult<object>(null)

}

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext 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 { getset}

[Required]

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

public string Password {

getset

}

[Required]

[Display(Name = "Confirm Password")]

[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]

public string ConfirmPassword { getset}

}

控制器本身,如果注册成功只是返回一个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)

}

}

1、首先让需要自动运行的类继承javax.servlet.http.HttpServlet

2、把需要自动运行的类中写一个init方法。(servlet应用程序启动的入口就是init方法)

public void init(){

            System.out.println("这样在web容器启动的时候,就会执行这句话了!")

}

3、在web.xml中新建一个servlet,如下:

  <servlet>

   <servlet-name>GenerateData</servlet-name>

   <servlet-class>com.yq.javaSCADA.business.impl.GenerateData</servlet-class>

   <load-on-startup>1</load-on-startup>

  </servlet>

4、启动的web服务器,tomcat,weblogic,jboss,就会自动运行类中的init方法了。

FineUI(ExtAspNet)控件 v3.2.5源码 源码描述: 关于FineUI FineUI是由ExtAspNet改名而来的 基于 ExtJS 的专业 ASP.NET 2.0 控件库。 FineUI的使命 创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序。 ...


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12038219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存