从ASP.NET Core API向Firebase身份验证添加用户声明

时间:2018-07-08 12:24:18

标签: firebase firebase-authentication asp.net-core-webapi

给出一个asp.net核心api和仅使用[Authorize]属性的有效Firebase身份验证,如何将自定义声明添加到令牌中以使用[Authorize(Policy =“ admin”)]?管理SDK仅适用于node.js,Java,python或go,我找不到有关如何直接使用Firebase Admin API的任何文档。据我了解,用户声明必须存储在Firebase Auth后端中。

2 个答案:

答案 0 :(得分:1)

自从发布Firebase Admin .NET SDK 1.1以来,支持“使用自定义声明进行控制访问”功能。

您可以在这里找到存储库:https://github.com/firebase/firebase-admin-dotnet

设置指南和文档:https://firebase.google.com/docs/admin/setup

解决方案:

// Initialize the admin SDK with your service account keys
FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromFile("path/to/serviceAccountKey.json"),
});

// Create the custom user claim that has the role key
var claims = new Dictionary<string, object>
{
    { ClaimTypes.Role, "Administrator" }
};

// This will call the Firebase Auth server and set the custom claim for the user
await FirebaseAuth.DefaultInstance.SetCustomUserClaimsAsync(uid, claims);

答案 1 :(得分:0)

据我所知,使用C#Firebase Admin SDK无法做到。 我遇到了同样的问题,起初,我使用令牌来获取用户ID,从数据库中检索用户ID的角色,设置了Claims数组,并使用添加了的Claims创建了一个自定义令牌。然后,我通过其REST API将其发送给Firebase,以获取常规的Firebase ID和Refresh令牌,如reference guide中所述。最后,我把令牌交给了客户。 但是,我遇到了问题(大多数是404错误),并且没有很好地记录您需要对验证中间件进行哪些更改才能接受新发行的令牌,而且我从未能够获得刷新令牌,因为它从未在REST中获得过API响应。我什至按照herehere中的步骤进行操作,并根据Firebase的指示铸造了自己的自定义令牌,但始终无法使该死的东西正常工作。

所以我最终做了一些不同的事情。我从Firebase IdToken中检索了用户声明,并使用System.IdentityModel.Tokens.Jwt创建了自己的令牌。我在那里添加了自己的主张和角色,并将其发送给客户。现在,客户端使用FireBase登录,但是我可以完全控制令牌以使用我的API

这就是我修改启动方式的方式。请记住,我还没有玩完所有选项

....

            <HorizontalScrollView
                android:id="@+id/horizantal_scroll_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="10dp"
                android:fadeScrollbars="false"
                android:foregroundGravity="center"
                android:scrollbarThumbHorizontal="@null"
                android:scrollbars="horizontal"
                android:visibility="gone">

                <LinearLayout
                    android:id="@+id/services_linear_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="1dp"
                    android:gravity="center"
                    android:orientation="horizontal"></LinearLayout>


            </HorizontalScrollView>
....

这是简化的编码功能:

var key = System.Text.Encoding.UTF8.GetBytes(Configuration["MyToken:Key"]);
    services.AddAuthentication(
        auth => {
        auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;})
    .AddJwtBearer(options => {
        options.RequireHttpsMetadata = false;
        options.IncludeErrorDetails = true;
        options.TokenValidationParameters = new TokenValidationParameters {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateLifetime = true
        };
   });

这种方法的缺点是用户注册时会增加往返次数,但是仅当用户需要令牌时才这样做,因此不应增加太多延迟,而且我可以延长其使用寿命令牌超过60分钟。

欢迎对此方法提出建议和(建设性)意见!

希望这会有所帮助!