Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SPA-Firebase和.Net WebApi 2身份验证_Javascript_C#_Asp.net_Angularjs_Firebase - Fatal编程技术网

Javascript SPA-Firebase和.Net WebApi 2身份验证

Javascript SPA-Firebase和.Net WebApi 2身份验证,javascript,c#,asp.net,angularjs,firebase,Javascript,C#,Asp.net,Angularjs,Firebase,我有一个用AngularJs编写的单页应用程序(框架在这一点上是无关的),该应用程序托管在IIS中,它由index.html和一堆客户端资产组成 在后端,我有WebApi 2,作为一个单独的应用程序托管在IIS中 对于客户端的身份验证,我使用Firebase(简单登录),并启用了一些社交网络,如Facebook、Twitter或Google 到目前为止还不错。我喜欢使用firebase启用twitter身份验证的简单性 在使用社交网络登录时,我从firebase、firebaseAuthToke

我有一个用AngularJs编写的单页应用程序(框架在这一点上是无关的),该应用程序托管在IIS中,它由index.html和一堆客户端资产组成

在后端,我有WebApi 2,作为一个单独的应用程序托管在IIS中

对于客户端的身份验证,我使用Firebase(简单登录),并启用了一些社交网络,如Facebook、Twitter或Google

到目前为止还不错。我喜欢使用firebase启用twitter身份验证的简单性

在使用社交网络登录时,我从firebase、firebaseAuthToken和提供者accesstoken返回

现在,我想使用firebaseAuthToken或提供者访问令牌通过我的WebApi进行身份验证

问题是:在给定条件下使用WebApi进行身份验证的最佳方式是什么?

因为我在服务器上有复杂的业务逻辑,所以并没有选择只使用firebase来存储我的数据和摆脱web api

到目前为止,我有一个愚蠢的想法,就是将社交提供者访问令牌传递给服务器,根据提供者验证令牌,然后使用Owin-Katana发布安全令牌

我没有使用katana提供的内置社交提供商支持,因为缺乏文档、复杂性以及与单页应用程序的集成度差。我发现SPA的visual studio模板过于特定于mvc。但那就是我:)

tl;博士 下面的步骤可能看起来很长,但实际上很简单。我在大约一个小时内创建了我的演示项目


我同意你使用Owin和Katana。我以前也经历过这个过程,但这并不是一次很好的经历。使用Firebase要简单得多

这一切都可以用JWTs完成

当您通过Firebase和任何社交提供商进行身份验证时,您将获得一个JSON Web令牌(JWT)firebaseAuthToken

从仪表板上获取Firebase机密 JWTs的工作方式是我们有一个秘密令牌和一个客户端令牌。客户端令牌是我们登录后收到的firebaseAuthToken。机密令牌是在Firebase仪表板中为我们生成的

将Firebase机密存储在Web.config的appSettings部分 我们需要将此密钥存储在Web.config中,以便以后更容易访问

<add key="FirebaseSecret" value="<Firebase-Secret-Token-Goes-Here" />
成功登录时,将firebaseAuthToken设置为sessionStorage 每当用户登录时,我们都可以将该值设置为
sessionStorage

.factory('authInterceptor', function ($rootScope, $q, $window) {
    return {
        request: function (config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage.firebaseAuthToken) {
                config.headers.Authorization = $window.sessionStorage.firebaseAuthToken;
            }
            return config;
        },
        response: function (response) {
            if (response.status === 401) {
                // TODO: User is not authed
            }
            return response || $q.when(response);
        }
    };
})
$rootScope.$on('$firebaseSimpleLogin:login',
    function (e, user) {

        // add a cookie for the auth token
        if (user) {
            $window.sessionStorage.firebaseAuthToken = user.firebaseAuthToken;
        }

        cb(e, user);
    });
全局注册解码JWT过滤器 在
WebApiConfig.cs
Register方法中,我们可以将DecodeJWT过滤器设置为适用于所有APIController

config.Filters.Add(new DecodeJWT());
现在,每当我们向ApiController发出请求时,它都会拒绝它,除非有一个有效的JWT。因此,用户登录后,如果ApiController不存在,我们可以将其数据保存到ApiController

// globally uses DecodeJWT
public class UsersController: ApiController 
{
    // POST api/users
    public void Post([FromBody] FbUser user) // See GitHub for this Model
    {
        // Save user if we do not already have it
    }
}

用户的身份如何绑定到会话?HttpContext.Current.User?您好。。对不起,如何设置[AllowAnonymous]API。。所以我的意思是。。。让一些api对未登录的用户开放。。非常感谢!不幸的是,数据库机密已过时Firebase版本3不再支持这些密钥
// globally uses DecodeJWT
public class UsersController: ApiController 
{
    // POST api/users
    public void Post([FromBody] FbUser user) // See GitHub for this Model
    {
        // Save user if we do not already have it
    }
}