码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权


    合集 - Blazor 身份验证和授权(16)
    1.Blazor Wasm 身份验证和授权之 OpenID 与 OAuth201-122.Blazor Wasm Google 登录01-123.Blazor Wasm Gitee 码云登录01-124.Blazor入门100天 : 身份验证和授权 (1) - 建立带身份验证工程2023-02-015.Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据2023-02-076.Blazor入门100天 : 身份验证和授权 (5) - 本地化资源2023-02-027.Blazor入门100天 : 身份验证和授权 (4) - 自定义字段2023-02-028.Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite2023-02-029.Blazor入门100天 : 身份验证和授权 (2) - 角色/组件/特性/过程逻辑2023-02-0210.Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务01-1711.Blazor OIDC 单点登录授权实例2-登录信息组件wasm01-1712.Blazor OIDC 单点登录授权实例3-服务端管理组件01-1713.Blazor OIDC 单点登录授权实例6 - Winform 端授权01-2314.Blazor IDC 单点登录授权实例4 - 部署服务端/独立WASM端授权01-2315.宝塔部署自动续签SSL证书跟 oauth get OpenIdConnect WellknownConfiguration 冲突解决方法01-11
    16.Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权02-13
    收起

    目录:

    1. OpenID 与 OAuth2 基础知识
    2. Blazor wasm Google 登录
    3. Blazor wasm Gitee 码云登录
    4. Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务
    5. Blazor OIDC 单点登录授权实例2-登录信息组件wasm
    6. Blazor OIDC 单点登录授权实例3-服务端管理组件
    7. Blazor OIDC 单点登录授权实例4 - 部署服务端/独立WASM端授权
    8. Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp)端授权
    9. Blazor OIDC 单点登录授权实例6 - Winform 端授权
    10. Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权

    (目录暂时不更新,跟随合集标题往下走)

    源码

    BlazorSSRAppOIDC

    十分钟搞定单点登录

    单点登录(SSO)简化了用户体验,使用户能够在访问多个应用时只需一次登录。这提高了用户满意度,减少了密码遗忘的风险,同时增强了安全性。但是,实现单点登录并不容易,需要应用程序实现和认证服务器的交互逻辑,增加了应用程序的开发工作量。例子中的安全策略中提供了 OpenID Connect (OIDC) 的能力,无需对应用做过多的修改,在十分钟内即可立刻实现单点登录。

    当采用单点登录之后,用户只需要登录一次,就可以访问多个应用系统。SSO 通常由一个独立的身份管理系统来完成,该系统为每个用户分配一个全局唯一的标识,用户在登录时,只需要提供一次身份认证,就可以访问所有的应用系统。我们在使用一些网站时,经常会看到“使用微信登录”、“使用 Google 账户登录”等按钮,这些网站就是通过 SSO 来实现的。

    采用单点登录有以下几个好处:

    用户只需要登录一次,就可以访问多个应用系统,不需要为每个应用系统都单独登录。
    应用系统不需要自己实现用户认证,只需将认证工作交给单点登录系统,可以大大减少应用系统的开发工作量。

    使用 OIDC 单点登录, 可以简化客户端编写流程, 专注于功能实现而不用重复撰写登录部分功能代码, 也不用直接接触身份验证数据库, 剥离繁琐的重复劳动部分.

    建立 net8 webapp ssr 工程

    引用以下库

        
            
            
            
            
            
        
    

    _Imports.razor 加入引用

    @using BootstrapBlazor.Components
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Authorization
    

    App.razor 加入必须的UI库引用代码

    完整文件

    
    
    
    
        
        
        
        
        
        
        
        
        
    
    
    
        
        
        
        
    
    
    
    

    Routes.razor 加入授权

    完整代码

    
        
            
                
                    

    您无权访问该资源.

    正在验证您的身份...

    添加Oidc授权配置

    新建 OidcProfile.cs 文件

    using Microsoft.AspNetCore.Authentication;
    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.IdentityModel.Protocols.OpenIdConnect;
    using System.Security.Claims;
    
    namespace OidcClientShared;
    
    public class OidcProfile
    { 
    
        public static void OidcDIY(OpenIdConnectOptions options)
        {
            var authority = "https://ids2.app1.es/"; //由于时间的关系,已经部署有一个实际站点, 大家也可以参考往期文章使用本机服务器测试
            //authority = "https://localhost:5001/"; 
            var clientId = "Blazor5002";
            var callbackEndPoint = "http://localhost:5002";
    
            options.Authority = authority;
            options.ClientId = clientId;
            options.ResponseType = OpenIdConnectResponseType.Code;
            options.ResponseMode = OpenIdConnectResponseMode.Query;
    
            options.SignedOutRedirectUri = callbackEndPoint;
            options.CallbackPath = "/authentication/login-callback";
            options.SignedOutCallbackPath = "/authentication/logout-callback";
            options.Scope.Add("BlazorWasmIdentity.ServerAPI openid profile");
    
            options.GetClaimsFromUserInfoEndpoint = true;
            options.SaveTokens = true;
            options.MapInboundClaims = false;
            options.ClaimActions.MapAll();
            options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
            options.ClaimActions.MapJsonKey(ClaimValueTypes.Email, "email", ClaimValueTypes.Email);
            options.ClaimActions.MapJsonKey(ClaimTypes.Role, "role");
    
            options.Events = new OpenIdConnectEvents
            {
                OnAccessDenied = context =>
                {
                    context.HandleResponse();
                    context.Response.Redirect("/");
                    return Task.CompletedTask;
                },
    
                OnTokenValidated = context =>
                {
                    var token = context.TokenEndpointResponse?.AccessToken;
                    if (!string.IsNullOrEmpty(token))
                    {
                        if (context.Principal?.Identity != null)
                        {
                            var identity = context.Principal!.Identity as ClaimsIdentity;
                            identity!.AddClaim(new Claim("AccessToken", token)); 
                        }
    
                    }
    
                    return Task.CompletedTask;
                }
    
            };
    
        }
    
    }
    

    Program.cs 加入授权相关

    其中要加入Razor的cshtml支持, 因为登录要依靠管道跳转. 上下有两行都注释在文件内了.

    完整代码

    using BlazorSSRAppOIDC.Components;
    using OidcClientShared;
    
    var builder = WebApplication.CreateBuilder(args);
    
    //在具有 Blazor Web 应用程序模板的 .NET 8 中,需要将其更改为, 由于该Pages文件夹已移至该Components文件夹中,因此您需要指定新位置的根目录,或将该Pages文件夹移回项目的根级别
    builder.Services.AddRazorPages().WithRazorPagesRoot("/Components/Pages");
    // Add services to the container.
    builder.Services.AddRazorComponents()
        .AddInteractiveServerComponents();
    
    builder.Services.AddCascadingAuthenticationState();
    builder.Services.AddHttpClient();
    builder.Services.AddDensenExtensions();
    builder.Services.ConfigureJsonLocalizationOptions(op =>
    {
        // 忽略文化信息丢失日志
        op.IgnoreLocalizerMissing = true;
    
    });
    
    builder.Services
        .AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc", OidcProfile.OidcDIY); 
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error", createScopeForErrors: true);
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseAntiforgery();
    //但出于某种原因,这还不够。在 Blazor Web 应用程序模板中,您明确需要调用
    app.MapRazorPages();
    
    app.MapRazorComponents()
        .AddInteractiveServerRenderMode();
    
    app.Run();
    

    Pages 文件夹新建登录Razor页实现登录和注销跳转

    展开 Login.cshtml 文件组合三角箭头, 编辑 Login.cshtml.cs

    Login.cshtml.cs

    using Microsoft.AspNetCore.Authentication;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    
    namespace PersonalToolKit.Server.Components.Pages;
    
    public class LoginModel : PageModel
    {
        public async Task OnGet(string redirectUri)
        {
            await HttpContext.ChallengeAsync("oidc", new AuthenticationProperties { RedirectUri = redirectUri });
        }
    
    }
    

    Logout.cshtml.cs

    using Microsoft.AspNetCore.Authentication;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    
    namespace PersonalToolKit.Server.Components.Pages;
    
    public class LogoutModel : PageModel
    {
        public async Task OnGet(string redirectUri)
        {
            await HttpContext.SignOutAsync("Cookies");
            await HttpContext.SignOutAsync("oidc", new AuthenticationProperties { RedirectUri = redirectUri });
        }
    
    }
    

    Routes.razor 加入授权

    完整代码

    Home.razor

    完整代码

    @page "/"
    @using System.Security.Claims
    @inject NavigationManager Navigation
    
    Home
    
     
    
        
    
            你好, @context.User.Identity?.Name (@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value)
           
            

    运行

  • 相关阅读:
    React的生命周期函数
    Linux: IO中断驱动开发教程
    对于女生来说,软件测试和前端,学哪一个更好啊
    基于Python深度学习的DGA域名检测
    【目录】RV1103/RV1106开发记录
    UI设计软件有哪些好用和免费的吗?
    mysql(5.5)启动服务和环境配置
    Ubuntu22.04 | 使用教程
    JAVA计算机毕业设计茶园认养管理平台演示录像2020Mybatis+源码+数据库+lw文档+系统+调试部署
    无网络maven私服添加jar和pom
  • 原文地址:https://www.cnblogs.com/densen2014/p/17969501
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号