当前位置: 首页 > 知识库问答 >
问题:

使用webapi的AngularJS客户端路由和令牌身份验证

鱼浩荡
2023-03-14

我想在SPA angularjs应用程序中创建一个身份验证和授权的示例,使用asp.netmvc webapi作为后端和客户端路由(没有cshtml)。下面只是可以用来设置完整示例的函数示例。但我就是不能把它们放在一起。任何帮助赞赏。

问题:

  1. 最佳实践是什么:基于Cookie还是基于令牌
  2. 如何在angular中创建承载令牌以在每次请求时进行授权
  3. API函数的验证
  4. 如何在客户端上保留已登录用户的身份验证

示例代码:

>

<form name="form" novalidate>
 <input type="text" ng-model="user.userName" />
 <input type="password" ng-model="user.password" />
 <input type="submit" value="Sign In" data-ng-click="signin(user)">
</form>

认证角度控制器

$scope.signin = function (user) {
$http.post(uri + 'account/signin', user)
    .success(function (data, status, headers, config) {
        user.authenticated = true;
        $rootScope.user = user;
        $location.path('/');
    })
    .error(function (data, status, headers, config) {

        alert(JSON.stringify(data));
        user.authenticated = false;
        $rootScope.user = {};
    });
};

我的API后端API代码。

[HttpPost]
public HttpResponseMessage SignIn(UserDataModel user)
{
    //FormsAuthetication is just an example. Can I use OWIN Context to create a session and cookies or should I just use tokens for authentication on each request? How do I preserve the autentication signed in user on the client?
    if (this.ModelState.IsValid)
    {
        if (true) //perform authentication against db etc.
        {
            var response = this.Request.CreateResponse(HttpStatusCode.Created, true);
            FormsAuthentication.SetAuthCookie(user.UserName, false);

            return response;
        }

        return this.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Invalid username or password");
    }
    return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState);
}

授权使用JWT库限制内容。

config.MessageHandlers.Add(new JsonWebTokenValidationHandler
{
  Audience = "123",
  SymmetricKey = "456"
});

我的API方法

[Authorize]
public IEnumerable<string> Get()
{
 return new string[] { "value1", "value2" };
}

共有1个答案

耿星雨
2023-03-14

是否使用cookie身份验证或(承载)令牌仍然取决于您拥有的应用程序类型。据我所知,目前还没有任何最佳实践。但是,由于您正在开发SPA,并且已经在使用JWT库,因此我倾向于基于令牌的方法。

不幸的是,我不能帮助你与ASP。NET,但通常JWT库会为您生成并验证令牌。您所要做的就是对凭证(和密码)调用generateencode,并对每个请求发送的令牌进行验证或解码。您不需要在服务器上存储任何状态,也不需要发送cookie,就像您使用FormsAuthentication所做的那样。SetAuthCookie(user.UserName,false)

我相信您的库提供了一个关于如何使用生成/编码和验证/解码令牌的示例。

因此,生成和验证不是您在客户端所做的事情。

流程如下所示:

  1. 客户端将用户提供的登录凭据发送到服务器

步骤1和3:

app.controller('UserController', function ($http, $window, $location) {
    $scope.signin = function(user) {
    $http.post(uri + 'account/signin', user)
        .success(function (data) {
            // Stores the token until the user closes the browser window.
            $window.sessionStorage.setItem('token', data.token);
            $location.path('/');
        })
        .error(function () {
            $window.sessionStorage.removeItem('token');
            // TODO: Show something like "Username or password invalid."
        });
    };
});

只要用户打开页面,会话存储就会保留数据。如果您想自己处理过期时间,您可以使用localStore来代替。界面是一样的。

步骤4:

要在每次请求时向服务器发送令牌,可以使用Angular所称的拦截器。您只需获取以前存储的令牌(如果有),并将其作为头附加到所有传出请求

app.factory('AuthInterceptor', function ($window, $q) {
    return {
        request: function(config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage.getItem('token')) {
                config.headers.Authorization = 'Bearer ' + $window.sessionStorage.getItem('token');
            }
            return config || $q.when(config);
        },
        response: function(response) {
            if (response.status === 401) {
                // TODO: Redirect user to login page.
            }
            return response || $q.when(response);
        }
    };
});

// Register the previously created AuthInterceptor.
app.config(function ($httpProvider) {
    $httpProvider.interceptors.push('AuthInterceptor');
});

并确保始终使用SSL!

 类似资料:
  • 问题内容: 我想创建一个使用asp.net mvc webapi作为后端和客户端路由(没有cshtml)的SPA angularjs应用程序中的身份验证和授权的示例。以下只是可用于设置完整示例的函数示例。但是我不能一概而论。任何帮助表示赞赏。 问题: 最佳实践是什么:基于Cookie或令牌? 如何创建有角度的承载令牌以对每个请求进行授权? 验证API函数? 如何在客户端上保留登录的登录用户? 示例

  • null 我的自定义rest筛选器: 上面的内容实际上会导致应用程序启动时出现一个错误:有人能告诉我如何最好地执行此操作吗?pre_auth筛选器是执行此操作的最好方法吗? 编辑 使用Spring-security实现解决方案 希望它能帮助其他人…

  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销

  • 如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一

  • 有时需要对某些网络资源(如Servlet、JSP等)进行访问权限验证,也就是说,有访问权限的用户才能访问该网络资源。进行访问权限验证的方法很多,但通过HTTP响应消息头的WWW-Authenticate字段进行访问权限的验证应该是众多权限验证方法中比较简单的一个。 通过HTTP响应消息头的WWW-Authenticate字段可以使浏览器出现一个验证对话框,访问者需要在这个对话框中输入用户名和密码,