.Net6 + GraphQL + MongoDb 实现GraphQL的认证和授权

介绍

文本说一下认证和授权,因为GraphQL的特殊性他不能直接使用微软提供的授权来做

正文

关于认证我这边没有自己写,我采用了okta提供的第三方认证服务,

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = OktaDefaults.ApiAuthenticationScheme;
    options.DefaultChallengeScheme = OktaDefaults.ApiAuthenticationScheme;
    options.DefaultSignInScheme = OktaDefaults.ApiAuthenticationScheme;
}).AddOktaWebApi(new OktaWebApiOptions()
{
    OktaDomain = "https://dev-xxxx.okta.com",
    AuthorizationServerId = "default",
    Audience = "api://default",
});


builder.Services
    .AddGraphQLServer()
    .AddQueryType<PostQuery>()
    .AddMutationType<PostMutation>()
    .AddSubscriptionType<PostSubscription>()
    .AddAuthorization()


app.UseAuthentication();


        [UsePaging]
        [UseOffsetPaging]
        [UseProjection]
        [UseFiltering]
        [UseSorting]
        [Authorize]
        public IExecutable<Post> GetPosts([Service] DbContext db)
        { 
            
            return db.Post.AsExecutable();

        }

我们先不加认证Jwt来调用下接口,可以发现提示没有权限
94

当我我们加上Jwt后
95

接下来我们加上授权看看,我们做一个简单的策略授权。

builder.Services.AddAuthorization(options =>
{

    options.AddPolicy("HasCountry", policy =>
        policy.RequireAssertion(context =>
            context.User.HasClaim(c => c.Type == "http://schemas.microsoft.com/identity/claims/scope")));
});


app.UseAuthorization();


 [Authorize(Policy = "HasCountry")]
    public class PostQuery
    {

        [UsePaging]
        [UseOffsetPaging]
        [UseProjection]
        [UseFiltering]
        [UseSorting]
        [Authorize]
        public IExecutable<Post> GetPosts([Service] DbContext db)
        { 
            
            return db.Post.AsExecutable();

        }
    }

96

认证授权的教程就先到这,这是一个非常简单的例子,GraphQL厉害的是可以对字段进行授权,我们高级篇再说

结语

本系列主要将GraphQL的使用,示例项目不能应用于生产,后续发一些GraphQL库出来讲解生产中的实际应用

联系作者:加群:867095512 @MrChuJiu

posted @ 2023-02-28 20:42  初久的私房菜  阅读(11917)  评论(0编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/