Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

这篇具有很好参考价值的文章主要介绍了Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录:

  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 工程

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

引用以下库

    <ItemGroup>
        <PackageReference Include="BootstrapBlazor" Version="8.*" />
        <PackageReference Include="Densen.Extensions.BootstrapBlazor" Version="8.*" />
        <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.*" />
        <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="8.*" />
        <PackageReference Include="Microsoft.Extensions.Http" Version="8.*" />
    </ItemGroup>

_Imports.razor 加入引用

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

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

完整文件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="/" />
    <Link Href="_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css" />
    <Link Href="_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css" />
    <Link Href="_content/BootstrapBlazor/css/motronic.min.css" />
    <link rel="stylesheet" href="app.css" />
    <link rel="stylesheet" href="BlazorSSRAppOIDC.styles.css" />
    <HeadOutlet @rendermode="new InteractiveServerRenderMode(false)" />
</head>

<body>
    <Routes @rendermode="new InteractiveServerRenderMode(false)" />
    <ReconnectorOutlet ReconnectInterval="5000" @rendermode="new InteractiveServerRenderMode(false)" />
    <Script Src="_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js"></Script>
    <script src="_framework/blazor.web.js"></script>
</body>

</html>

Routes.razor 加入授权

完整代码

<Router AppAssembly="typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)">
            <NotAuthorized>
                <p role="alert">您无权访问该资源.</p>
            </NotAuthorized>
            <Authorizing>
                <p>正在验证您的身份...</p>
            </Authorizing>
        </AuthorizeRouteView>
    </Found>
</Router>

添加Oidc授权配置

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

新建 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<App>()
    .AddInteractiveServerRenderMode();

app.Run();

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

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

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

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

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

<PageTitle>Home</PageTitle>

 
<AuthorizeView>
    <Authorized>

        你好, @context.User.Identity?.Name (@context.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value)
       
        <Button Text="注销" OnClick="BeginLogOut" />

        <br /><br /><br />
        <h5>以下是用户的声明</h5><br />

        @foreach (var claim in context.User.Claims)
        {
            <p>@claim.Type: @claim.Value</p>
        }


    </Authorized>
    <NotAuthorized>

        <Button Text="登录" OnClick="BeginLogIn" />

        <p>默认账号 test@test.com 密码 0</p>

    </NotAuthorized>

</AuthorizeView>

@code {
    private string LoginUrl = "login?redirectUri=";
    private void BeginLogIn()
    {
        var returnUrl = Uri.EscapeDataString(Navigation.Uri);
        Navigation.NavigateTo(LoginUrl + returnUrl, forceLoad: true);
    }

    private string LogoutUrl = "logout?redirectUri=";
    private void BeginLogOut()
    {
        var returnUrl = Uri.EscapeDataString(Navigation.Uri);
        Navigation.NavigateTo(LogoutUrl + returnUrl, forceLoad: true);
    }

}

运行

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权文章来源地址https://www.toymoban.com/news/detail-825479.html

到了这里,关于Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET8 Blazor新特性 流式渲染

    什么是SSR Blazor中的流式渲染结合了SSR(服务端渲染),服务端将HTML拼好返回给前端,有点像我们熟知的Razor Pages 或 MVC 。 当已经有了 Razor Pages 或 MVC 时,为什么还要选择使用 Blazor 来实现这一点?这里有几个原因。 首先,Razor Pages 和 MVC 没有像Blazor这样提供了很好的可重用组

    2024年02月05日
    浏览(32)
  • .NET8 Blazor的Auto渲染模式的初体验

    .NET8发布后,Blazor支持四种渲染方式 静态渲染,这种页面只可显示,不提供交互,可用于网页内容展示 使用Blazor Server托管的通过Server交互方式 使用WebAssembly托管的在浏览器端交互方式 使用Auto自动交互方式,最初使用 Blazor Server,并在随后访问时使用 WebAssembly 自动进行交互式

    2024年02月05日
    浏览(35)
  • 微信公众平台测试号申请、使用HBuilder X与微信开发者工具实现授权登陆功能以及单点登录

    测试账号申请 测号响应流程:客户端发送请求,微信服务器收到请求后,转发到开发者服务器上,处理完后在发送给微信服务器,在返回给客户端 1、打开微信公众平台,点击测试帐号申请。地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login, 通过微信扫一扫授权就能进

    2024年02月02日
    浏览(37)
  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、授权和鉴权 、网关 、注册与发现 系统架构 docker部署

    源代码地址https://github.com/junkai-li/NetCoreKevin 基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、 docker部署  如需简约项目可直接去除项目引用 解耦设计都可以单独引用 架构默认全部引用并启动 项目启动时

    2023年04月24日
    浏览(33)
  • 【独立版】点大商城V2_2.4.6全开源版带+unipp前端,新增小程序端首次授权登录

    【独立版】点大商城V2 搭建请私信我 查看更多关于 点大商城V2 的文章 _2.4.6全开源版带+unipp前端,新增小程序端首次授权登录时是否提示设置头像昵称! 点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用,支持H5、微信公众号、微信小程序、头条小程序、支付宝

    2024年02月12日
    浏览(34)
  • 【MATLAB App Designer】实例:调用simulink模型并打包为独立程序

    本人第一次写文章,如有纰漏还请指出,望海涵。 本人等级不够,标签都加不了qwq,大家点点赞哈。 App Designer是Mathworks继GUIDE后推出的用于构建 MATLAB 应用程序的环境。它进一步简化了布置用户界面可视组件的过程。 本人使用的是R2021b版本,其AppDesigner的资源比较丰富; 本文

    2024年02月05日
    浏览(29)
  • 【授权与认证】OAuth 2.0 和 OIDC 的异同点

    开发者谈 | OAuth 2.0 和 OIDC 协议的关系?(内含必看案例) 【Web 安全】CSRF 攻击详解 OAuth 2.0 的一个简单解释 OAuth 2.0 的四种方式 什么是Oauth2.0,Oauth2.0的四种授权模式 简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系

    2024年01月17日
    浏览(24)
  • MongoDB 6.0 单实例基于用户角色实现授权登录

    现代数据库系统能够存储和处理大量数据。因此,由任何一个用户单独负责处理与管理数据库相关的所有活动的情况相对较少。通常,不同的数据库用户需要对数据库的某些部分具有不同级别的访问权限:某些用户可能只需要读取特定数据库中的数据,而其他用户则必须能够

    2024年02月05日
    浏览(26)
  • 授权码 + PKCE 模式|OIDC & OAuth2.0 认证协议最佳实践系列【03】

    ​ 在上一篇文章中,我们介绍了 OIDC 授权码模式(点击下方链接查看), 本次我们将重点围绕 授权码 + PKCE 模式(Authorization Code With PKCE)进行介绍 ,从而让你的系统快速具备接入用户认证的标准体系。 OIDC OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接

    2024年02月01日
    浏览(77)
  • 使用 Vue 3 插件(Plugin)实现 OIDC 登录和修改密码(OIDC 系统以 Keycloak 为例)

    目前单位系统常用 Keycloak 作为认证系统后端,而前端之前写的也比较随意,这次用 Vue 3 插件以及 Ref 响应式来编写这个模块。另外,这个可能是全网唯一使用 keycloak 的 OIDC 原生更新密码流的介绍代码。 OIDC 客户端,这里选择 oidc-client-ts 来提供 OIDC 相关的服务,根据目前的调

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包