首页 > 其他分享 >Blazor Auto IDS/OIDC 单点登录授权实例讲解2

Blazor Auto IDS/OIDC 单点登录授权实例讲解2

时间:2024-01-17 09:36:05浏览次数:21  
标签:登录 Auto IDS User context using Blazor Microsoft Identity

目录:

  1. OpenID 与 OAuth2 基础知识
  2. Blazor wasm Google 登录
  3. Blazor wasm Gitee 码云登录
  4. Blazor SSR/WASM IDS/OIDC 单点登录授权实例讲解1
  5. Blazor SSR/WASM IDS/OIDC 单点登录授权实例讲解2
  6. Blazor SSR/WASM IDS/OIDC 单点登录授权实例讲解3

源码

BlazorOIDC/Shared

1. 编辑 BlazorOIDC.Shared 项目配置文件

<Project Sdk="Microsoft.NET.Sdk.Razor">

    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="7.*" />
        <PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="7.*" />
        <PackageReference Include="Microsoft.Extensions.Http" Version="7.*" />
        <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.*" />
        <PackageReference Include="BootstrapBlazor" Version="8.*" />
        <PackageReference Include="FreeSql" Version="3.*" />
        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
        <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.2" />
    </ItemGroup>

    <ItemGroup>
        <Using Include="Microsoft.AspNetCore.Components" />
        <Using Include="Microsoft.Extensions.Options" />
        <Using Include="Microsoft.JSInterop" />
        <Using Include="System.ComponentModel.DataAnnotations" />
    </ItemGroup>

</Project>

2. 共享工程添加登录信息组件

Pages/LogInfo.razor

@page "/logInfo"
@namespace Densen.Identity.Shared 
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Identity

@inject NavigationManager Navigation

<PageTitle>登录信息</PageTitle>

<h1>登录信息</h1>

<button @onclick="LogUsername">检查登录信息</button>

<p>@authMessage</p>

@code
{
    [Inject]
    [NotNull]
    protected IJSRuntime? jsRuntime { get; set; }

    private string LoginUrl = "Identity/Account/Login";
    private string LogoutUrl = "Identity/Account/Register";
    private string RegisterUrl = "Identity/Account/Register";

    private string? claimInfo;

    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            if (this.jsRuntime is IJSInProcessRuntime)
            {
                LoginUrl = "authentication/login";
                LogoutUrl= "authentication/logout";
                RegisterUrl = "authentication/register";
                StateHasChanged();
            }
        }
    }

    /// <summary>
    /// 级联参数获取身份验证状态数据
    /// </summary>
    [CascadingParameter]
    private Task<AuthenticationState>? authenticationStateTask { get; set; }

    private string? authMessage;

    private async Task LogUsername()
    {
        var authState = await authenticationStateTask!;
        var user = authState.User;

        if (user!.Identity!.IsAuthenticated)
        {
            authMessage = $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            authMessage = "The user is NOT authenticated.";
        }
    }

    private void BeginLogOut()
    {
        Navigation.NavigateTo(LogoutUrl, forceLoad: true);
    } 

}



<p>AuthorizeView 组件根据用户是否获得授权来选择性地显示 UI 内容。 如果只需要为用户显示数据,而不需要在过程逻辑中使用用户的标识,那么此方法很有用</p>

<AuthorizeView>
    <Authorized>

        你好, @context.User.Identity?.Name

        [
        @if (@context.User.IsInRole(AuthorizeRoles.Admin.ToString()))
        {
            <span>管理员 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.Superuser.ToString()))
        {
            <span>超级用户 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.User.ToString()))
        {
            <span>用户 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.R110.ToString()))
        {
            <span>R110用户 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.R120.ToString()))
        {
            <span>R120用户 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.R130.ToString()))
        {
            <span>R130用户 </span>
        }
        @if (@context.User.IsInRole(AuthorizeRoles.R140.ToString()))
        {
            <span>R140用户 </span>
        }
        ]

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

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

        <p>@claimInfo</p>


        <button type="submit" class="nav-link btn btn-link" @onclick="BeginLogOut">注销</button>

    </Authorized>
    <NotAuthorized>
        <span>看起来你还没登录</span>
        <a href="@RegisterUrl">注册</a>
        <a href="@LoginUrl">登录</a>
    </NotAuthorized>

</AuthorizeView>


<p>以下是基于角色或基于策略的授权,未登录不显示 </p>

<AuthorizeView Roles="Admin, Superuser">
    <p>只有管理员或超级用户才能看到.</p>
</AuthorizeView>

3. 添加共享引用文件

_Imports.razor

@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using System.Diagnostics.CodeAnalysis
@using Densen.Identity
@using Densen.Identity.Shared

4. 编辑功能菜单

BlazorOIDC.Client 项目 Shared/NavMenu.razor 文件

源码

BlazorOIDC/Client

<div class="nav-item px-3">
  <NavLink class="nav-link" href="logInfo">
    <span class="oi oi-plus" aria-hidden="true"></span> 登录信息
  </NavLink>
</div>

5. 添加 Shared 工程的页面路由

BlazorOIDC.Client 项目 App.razor 文件

Router 添加 BlazorOIDC.Shared 工程的页面路由

<Router AppAssembly="@typeof(App).Assembly" AdditionalAssemblies="new[] { typeof(BlazorOIDC.Shared._Imports).Assembly }">

6. 运行项目

点击登录, 然后点击新添加的页面, 测试有效

7. 其他

其他页面参考以前文章或者源码

BlazorOIDC/Client

标签:登录,Auto,IDS,User,context,using,Blazor,Microsoft,Identity
From: https://www.cnblogs.com/densen2014/p/17959984

相关文章

  • Blazor SSR/WASM IDS/OIDC 单点登录授权实例讲解1
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解1BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解2BlazorSSR/WASMIDS/OIDC单点登录授权实例讲解3源码BlazorOIDC/Server1.建立Bl......
  • Androidstudio copilot 安装
    如何安装AndroidStudioCopilot1.安装AndroidStudio首先,你需要安装AndroidStudio,这是一个用于开发Android应用程序的集成开发环境(IDE)。你可以从官方网站(Studio,并按照安装向导的指示进行安装。2.配置AndroidStudio安装完成后,你需要对AndroidStudio进行一些基本配置。打......
  • Androidstudio如何使用Copilot
    AndroidStudio如何使用Copilot引言AndroidStudio是一款功能强大的集成开发环境(IDE),提供了丰富的工具和功能来帮助开发者创建和调试Android应用程序。Copilot是GitHub开发的人工智能代码助手,可以为开发者提供代码自动补全和提示。本文将介绍如何在AndroidStudio中使用Copilot,以......
  • ANDROID AUTOMOTIVE 车载信息娱乐系统
    作为移动端操作系统的霸主-Android,也以一种新的姿态高调侵入造车领域,这就是Android车载信息娱乐系统-AndroidAutomotive。2.什么是AndroidAutomotive?AndroidAutomotive是一个基本Android平台车载信息娱乐系统,简称IVI(In-VehicleInfotainment)。AndroidAutomotive系统......
  • C#开源免费的Blazor图表库
    前言今天分享一款基于ApexCharts.js封装的、C#开源免费的Blazor图表库:Blazor-ApexCharts。10款值得推荐的BlazorUI组件库全面的ASP.NETCoreBlazor简介和快速入门ApexCharts.js介绍ApexCharts.js开源地址:https://github.com/apexcharts/apexcharts.jsApexCharts......
  • 当 autovacuum 不工作时
    快速回顾一下,autovacuum后台进程清理死行,例如旧的已删除行版本。您也可以通过运行手动执行清理VACUUM,但autovacuum会根据表中死行的数量在适当的时候自动执行清理,不要太频繁但足够频繁以控制“垃圾”的数量。一般来说,autovacuum不能运行得太频繁,只有在表中累积了一定数量的死行后......
  • width:100%与width:auto区别
    小知识width:100%与width:auto区别width:100%:子元素的content撑满父元素的content,如果子元素还有padding、border等属性,或者是在父元素上设置了边距和填充,都有可能会造成子元素区域溢出显示;width:auto:是子元素的content+padding+border+margin等撑满父元素的cont......
  • C语言学习随笔-07 auto关键字
    1、在C中auto是一个存储类的关键字。     -auto存储类:auto存储类是所有局部变量默认的存储类。     -auto可以在声明变量的时候根据变量的初始值的类型自动为此变量选择匹配的类型。2、注意事项     -auto声明的变量必须要初始化,否则编译器不能判断变量......
  • Nuxt3教程:添加Autoanimate 动画库
    前言AutoAnimate是一个零配置,插入式动画实用程序,可以为您的Web应用程序添加平滑过渡。您可以将其与React,Solid,Vue,Svelte或任何其他JavaScript应用程序一起使用。正文安装依赖#yarnyarnadd@formkit/auto-animate#npmnpminstall@formkit/auto-animate#pnpmpnpmadd......
  • 软件测试/测试开发/全日制|Pytest如何使用autouse实现自动传参
    Pytestfixture之autouse使用写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参......