Angularjs 通过asp.net web api认证登录

Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认证登录

环境

Vs.net 2013

Asp.net mvc + web api

Individual user accounts

Angularjs

Underscore

新建一个asp.net mvc+ web api project

注册一个test用户用于测试

新建一个用于登录验证用户名密码的webapi controller 代码如下

public class LoginController : ApiController

{

[HttpGet]

public string Get()

{

AuthenticationManager.SignOut();

return "Success";

}

private IAuthenticationManager AuthenticationManager

{

get

{

return HttpContext.Current.GetOwinContext().Authentication;

}

}

UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

[HttpPost]

public HttpResponseMessage PostLogin(LoginViewModel model)

{

var user = UserManager.Find(model.UserName, model.Password);

if (user != null)

{

var identity = UserManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);

//FormsAuthentication.SetAuthCookie(model.UserName, false);

return Request.CreateResponse(HttpStatusCode.OK, "S");

}

else

{

return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid username or password.");

}

}

}

  

新建Index.html网页

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app">

<head>

<title></title>

<link href="Content/bootstrap.css" rel="stylesheet" />

<script src="Scripts/bootstrap.js"></script>

<script src="Scripts/jquery-1.10.2.js"></script>

<script src="Scripts/angular.js"></script>

<script src="Scripts/angular-route.js"></script>

<script src="Scripts/app.js"></script>

<script src="Scripts/underscore.js"></script>

</head>

<body>

<div class="row">

<div class="large-12">

<div id="view" ng-view></div>

</div>

</div>

</body>

</html>

  

登录Login.html 子页面

<div class="col-md-4 col-md-offset-4" login-directive>

<!--<div class="panel panel-default">

<div class="panel-heading">

<h3 class="panel-title">Please sign in</h3>

</div>

<div class="panel-body">

<form accept-charset="UTF-8" role="form" name="form">

<fieldset>

<div class="form-group">

<input class="form-control" placeholder="E-mail" name="email" type="text" ng-model="credentials.UserName" required>

</div>

<div class="form-group">

<input class="form-control" placeholder="Password" name="password" type="password" value="" ng-model="credentials.Password" required>

</div>

<div class="checkbox">

<label>

<input name="remember" type="checkbox" value="Remember Me" ng-model="credentials.RememberMe"> Remember Me

</label>

</div>

<p class="text-danger" ng-show="message">{{message}}</p>

<input class="btn btn-lg btn-success btn-block" ng-click="login()" ng-disabled="form.$invalid" type="submit" value="Login">

</fieldset>

</form>

</div>

</div>-->

</div>

  

Home.html登录进去的首页

<div class="container">

。。。。。。

</div>

认证流程

angularjs代码

var app = angular.module("app", ['ngRoute']);

app.config(function ($routeProvider) {

$routeProvider.when('/login', {

templateUrl: 'templates/login.html',

controller:'LoginController'

});

$routeProvider.when('/home', {

templateUrl: 'templates/home.html',

controller:'HomeController'

});

$routeProvider.otherwise({redirectTo:'/login'});

});

定义route,默认显示login登录界面

app.factory("SessionService", function () {

return {

get: function (key) {

return sessionStorage.getItem(key);

},

set: function (key, val) {

return sessionStorage.setItem(key, val);

},

unset: function (key) {

return sessionStorage.removeItem(key);

}

}

});

保存登录session,

app.factory("AuthenticationService", function ($http, $location, SessionService, MessageService) {

var cacheSession = function () {

SessionService.set('authenicated',true);

};

var uncacheSession = function () {

SessionService.unset('authenicated');

};

var loginError = function (response) {

MessageService.show(response.Message);

};

return {

login: function (credentials) {

//if (credentials.UserName !== "admin" ||

// credentials.Password !== "admin") {

// alert("Username must be 'admin/admin'");

//}

//else {

// $location.path('/home');

//}

//return $http.post("/api/Login", credentials)

var login = $http.post("/api/Login", credentials);

login.success(cacheSession);

login.success(MessageService.clean);

login.error(loginError);

return login;

},

logout:function(){

//$location.path('/login');

//return $http.get("/api/Login");

var logout = $http.get("/api/Login");

logout.success(uncacheSession);

return logout;

},

isLoggedIn: function () {

return SessionService.get('authenicated');

}

};

});

与后台web api交互认证用户名/密码 服务

app.controller("LoginController", function ($scope, $location,$http, AuthenticationService) {

$scope.credentials = { UserName: "", Password: "", RememberMe:false};

$scope.login = function () {

AuthenticationService.login($scope.credentials).success(function () {

$location.path("/home");

});

}

});

Login方法登录成功重定向home页面

为了防止用户直接在地址栏输入/home跳过登录界面

app.run(function ($rootScope, $location, AuthenticationService, MessageService) {

var routesThatRequireAuth = ['/home'];

$rootScope.$on('$routeChangeStart', function (event,next,current) {

if(_(routesThatRequireAuth).contains($location.path()) &&

!AuthenticationService.isLoggedIn()) {

MessageService.show("Please login");

$location.path('/login');

}

});

});

必须登录过才能访问/home页面

Homecontroller代码

app.controller("HomeController", function ($scope, $location, $http, AuthenticationService) {

$scope.credentials = { UserName: "", Password: "", RememberMe: false };

$scope.logout = function () {

AuthenticationService.logout().success(function () {

$location.path("/login");

});

};

$scope.getvalue = function () {

var url = "/api/values";

$http.get(url).success(function (data) {

console.log(data);

})

.error(function (data) {

console.log(data);

});

};

// $scope.getvalue();

$scope.expiry = function () {

var url = "/api/values";

$http.post(url).success(function (data) {

console.log(data);

})

.error(function (data) {

console.log(data);

});

};

//$scope.expiry();

});

ValuesController Authroize属性,必须认证通过才能访问

[Authorize]

public class ValuesController : ApiController

{

// GET api/<controller>

//[Authorize]

public IEnumerable<string> Get()

{

return new string[] { "value1", "value2" };

}

Homecontroller中可以logout登出,和getvalue获取需要认证的webapi。如果用户长时间在home页面服务器端session过期后在调用getvalue方法会访问401错误。这是如果捕获到401错误,那么就要重定向到/login页面

下面的代码就是用捕获401错误

app.config(function ($httpProvider) {

var LogOutUserOn401 = function ($location, $q, SessionService, MessageService) {

var success = function (response) {

//alert("success" + response.status);

return response;

};

var error = function (response) {

//alert("error:" + response.status);

if (response.status === 401) {

SessionService.unset('authenicated');

MessageService.show(response.Message);

$location.path('/login');

return $q.reject(response);

} else {

return $q.reject(response);

}

};

return function (promise) {

return promise.then(success, error);

};

};

$httpProvider.responseInterceptors.push(LogOutUserOn401);

});

注意:默认情况下mvc如果认证过期返回的302重定向到mvc提供的登录界面而不是返回401错误代码,就需要修改Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app)

{

// Enable the application to use a cookie to store information for the signed in user

//app.UseCookieAuthentication(new CookieAuthenticationOptions

//{

// AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,

// LoginPath = new PathString("/Account/Login")

//});

app.UseCookieAuthentication(new CookieAuthenticationOptions()

);

功能演示

Angularjs 通过asp.net web api认证登录的更多相关文章

  1. 前端AngularJS后端ASP.NET Web API上传文件

    本篇体验使用AngularJS向后端ASP.NET API控制器上传文件.    首先服务端: public class FilesController : ApiController { //usi ...

  2. [转] JSON Web Token in ASP.NET Web API 2 using Owin

    本文转自:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ...

  3. JSON Web Token in ASP.NET Web API 2 using Owin

    In the previous post Decouple OWIN Authorization Server from Resource Server we saw how we can separ ...

  4. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证 chsakell分享了前端使用AngularJS,后端使用ASP. ...

  5. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  6. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  7. [转]ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/parry/p/ASPNET_MVC_Web_API_digest_authentication.html 在前一篇文章中,主要讨论了使用HTT ...

  8. ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

    在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认 ...

  9. ASP.NET Web API安全认证

    http://www.cnblogs.com/codeon/p/6123863.html http://open.taobao.com/docs/doc.htm?spm=a219a.7629140.0 ...

随机推荐

  1. 现代编译原理--第六章(中间树 IR Tree 含源码)

    (转载请表明出处   http://www.cnblogs.com/BlackWalnut/p/4559717.html ) 这一章,就虎书而言,理论知识点是及其少的,就介绍了为什么要有一个中间表示树 ...

  2. android 平台 java和javascript 通信问题 A WebView method was called on thread 'JavaBridge'.

      java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge ...

  3. SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 错误

    在一次改bug的过程,爆出了数据库错误,但是一看后面控制台,并没有爆出以前的具体的数据库错误的原因,而是 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, In ...

  4. AOP打印请求日志,打印返回值

    @Aspect // 申明是个spring管理的bean @Component @Slf4j public class LogAspectServiceApi { private JSONObject ...

  5. Linux 下查看我们的不速之客

    我们通过下面这个命令,可以查看 VPS 上还有谁在登陆: w 输出类似下列信息: 23:20:00 up 960 days, 4:29, 2 user, load average: 0.05, 0.0 ...

  6. Linux学习---GCC编译过程

    (一)GCC编译过程 预处理 cpp -o a.i a.c     //生成预处理文件 等同于[gcc -E] //预处理为将宏定义(#define)等进行替换. 编译 /user/lib/gcc/i ...

  7. CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)

    https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点 ...

  8. pyinstaller打包程序 带图片

    首选说一下,这种打包方式只能在本电脑上使用运行正常 准备:.py文件:你的程序 gif文件:你要用的图片 第一步: 在上面文件所在目录打开cmd 输入 pyi-makespec FP.py 会生成一个 ...

  9. django创建上下文

    在app中创建context_processes.py(可以是别的名字),然后加载到settings里,这样所有的网页都可以传入变量 from .models import User def app0 ...

  10. java visualVM(jconsole)远程监控服务器java进程

    1. JMX方式(jconsole也可通过此方式进行连接) jmx方式能监控到CPU信息,但无法使用visualVM的visualVM GC插件    jmx无密码方式 监控普通的java进程 . 设 ...