Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在blazor web程序集中获取id_令牌_Asp.net Core_Openid Connect_Blazor_Blazor Webassembly - Fatal编程技术网

Asp.net core 如何在blazor web程序集中获取id_令牌

Asp.net core 如何在blazor web程序集中获取id_令牌,asp.net-core,openid-connect,blazor,blazor-webassembly,Asp.net Core,Openid Connect,Blazor,Blazor Webassembly,我有一个Blazor WebAssembly最新的3.2.0应用程序,带有oidc身份验证。 asp.net身份验证提供了一种获取accessToken的方法,但看不到任何访问我的场景所需的id_令牌jwt的方法。 我可以在浏览器的本地存储中看到id_令牌。 访问它的最佳方式是什么 谢谢您可以使用JSInterop从会话存储中读取它,它存储在oidc键上。用户:{app baseUri}:{app client id}: @注入IJSRuntime JSRuntime @注入Navigation

我有一个Blazor WebAssembly最新的3.2.0应用程序,带有oidc身份验证。 asp.net身份验证提供了一种获取accessToken的方法,但看不到任何访问我的场景所需的id_令牌jwt的方法。 我可以在浏览器的本地存储中看到id_令牌。 访问它的最佳方式是什么


谢谢

您可以使用JSInterop从会话存储中读取它,它存储在oidc键上。用户:{app baseUri}:{app client id}:

@注入IJSRuntime JSRuntime @注入NavigationManager NavigationManager ... @代码{ 专用异步任务ReadIdToken { const string clientId=您的oidc客户端id; var userDataKey=$oidc.user:{NavigationManager.BaseUri}:{clientId}; var userData=await JSRuntime.InvokeAsyncsessionStorage.getItem,userDataKey; 返回userData.id_令牌; } 类用户数据 { 公共字符串id_标记{get;set;} 公共int在{get;set;}处过期 } }
您可以使用JSInterop从会话存储中读取它,它存储在键oidc处。用户:{app baseUri}:{app client id}:

@注入IJSRuntime JSRuntime @注入NavigationManager NavigationManager ... @代码{ 专用异步任务ReadIdToken { const string clientId=您的oidc客户端id; var userDataKey=$oidc.user:{NavigationManager.BaseUri}:{clientId}; var userData=await JSRuntime.InvokeAsyncsessionStorage.getItem,userDataKey; 返回userData.id_令牌; } 类用户数据 { 公共字符串id_标记{get;set;} 公共int在{get;set;}处过期 } }
下面是一个工作代码示例,它允许您以原始格式获取id_令牌以及从中解析的声明列表

注意:您应该在查看结果之前进行身份验证

@page "/"

@inject IJSRuntime JSRuntime
@inject NavigationManager NavigationManager

@using System.Security.Claims
@using System.Text.Json

<p>@JwtToken</p>

@foreach (var claim in claims)
{
    <p>@claim</p>
}


@code {
      List<Claim> claims = new List<Claim>();
      string JwtToken;


    protected override async Task OnInitializedAsync()
    {
        await GetJwtToken();

    }
    private async Task GetJwtToken()
    {
        var baseUri = NavigationManager.BaseUri.Substring(0, 
                              NavigationManager.BaseUri.Length - 1);
        // client id example: RoleBasedApiAuthorization.Client 
        const string clientID = "<Place here your client id>";
        var key = $"oidc.user:{baseUri}:{clientID}";
        JwtToken = await JSRuntime.InvokeAsync<string> 
                                    ("sessionStorage.getItem", key);

        if (JwtToken != null)
        {
            claims = ParseClaimsFromJwt(JwtToken).ToList();
        }

    }


    public IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
    {
        var payload = jwt.Split('.')[1];
        var jsonBytes = ParseBase64WithoutPadding(payload);
        var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);
        return keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString()));
    }

    private byte[] ParseBase64WithoutPadding(string base64)
    {
        switch (base64.Length % 4)
        {
            case 2: base64 += "=="; break;
            case 3: base64 += "="; break;
        }
        return Convert.FromBase64String(base64);
    }
}

下面是一个工作代码示例,它允许您以原始格式获取id_令牌以及从中解析的声明列表

注意:您应该在查看结果之前进行身份验证

@page "/"

@inject IJSRuntime JSRuntime
@inject NavigationManager NavigationManager

@using System.Security.Claims
@using System.Text.Json

<p>@JwtToken</p>

@foreach (var claim in claims)
{
    <p>@claim</p>
}


@code {
      List<Claim> claims = new List<Claim>();
      string JwtToken;


    protected override async Task OnInitializedAsync()
    {
        await GetJwtToken();

    }
    private async Task GetJwtToken()
    {
        var baseUri = NavigationManager.BaseUri.Substring(0, 
                              NavigationManager.BaseUri.Length - 1);
        // client id example: RoleBasedApiAuthorization.Client 
        const string clientID = "<Place here your client id>";
        var key = $"oidc.user:{baseUri}:{clientID}";
        JwtToken = await JSRuntime.InvokeAsync<string> 
                                    ("sessionStorage.getItem", key);

        if (JwtToken != null)
        {
            claims = ParseClaimsFromJwt(JwtToken).ToList();
        }

    }


    public IEnumerable<Claim> ParseClaimsFromJwt(string jwt)
    {
        var payload = jwt.Split('.')[1];
        var jsonBytes = ParseBase64WithoutPadding(payload);
        var keyValuePairs = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonBytes);
        return keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString()));
    }

    private byte[] ParseBase64WithoutPadding(string base64)
    {
        switch (base64.Length % 4)
        {
            case 2: base64 += "=="; break;
            case 3: base64 += "="; break;
        }
        return Convert.FromBase64String(base64);
    }
}

非常感谢你们——我已经为此绞尽脑汁一周了——doh——忘记在Chrome中查看浏览器会话数据来考虑使用JRuntime

我不确定这是否是特定于Cognito的,但对我来说关键不是使用NavigationManager BaseUri,而是使用OIDC权限

@页面/ @使用System.Text.Json @注入IJSRuntime JSRuntime 第一 @代码{ JSONSerializedRoptions缩进=新JSONSerializedRoptions{WriteIndended=true}; CachedAuthSettings; 认知用户; 受保护的重写异步任务OnInitializedAsync { string key=Microsoft.AspNetCore.Components.WebAssembly.Authentication.CachedAuthSettings; string authSettingsRAW=await JSRuntime.InvokeAsyncsessionStorage.getItem,键; authSettings=JsonSerializer.DeserializeauthSettingsRAW; 字符串userRAW=await JSRuntime.InvokeAsyncsessionStorage.getItem,authSettings?.OIDCUserKey; user=JsonSerializer.DeserializeuserRAW; } 公共类缓存设置 { 公共字符串授权{get;set;} 公共字符串metadataUrl{get;set;} 公共字符串客户端\u id{get;set;} 公共字符串[]默认范围{get;set;} 公共字符串重定向_uri{get;set;} 公共字符串post\u logout\u redirect\u uri{get;set;} 公共字符串响应类型{get;set;} 公共字符串响应模式{get;set;} 公共字符串作用域{get;set;} 公共字符串OIDCUserKey=>$oidc.user:{authority}:{client_id}; } 公共类认知用户 { 公共字符串id_标记{get;set;} 公共字符串访问\u令牌{get;set;} 公共字符串刷新\u标记{get;set;} 公共字符串标记\u类型{get;set;} 公共字符串作用域{get;set;} 公共int在{get;set;}处过期 } }
如果我直接尝试使用JSRuntme.InvokeAsync将字符串转换为类,就会出现序列化错误,但它在JsonSerializer中运行良好,这就是为什么你们会看到这似乎是额外的一步。

非常感谢你们——我已经为此绞尽脑汁一周了——doh——忘记查看Chrome中的浏览器会话数据来考虑使用JRuntime

我不确定这是否是特定于Cognito的,但对我来说关键不是使用NavigationManager BaseUri,而是使用OIDC权限

@页面/ @使用System.Text.Json @注入IJSRuntime JSRuntime 第一 @代码{ JSONSerializedRoptions缩进=新JSONSerializedRoptions{WriteIndended=true}; CachedAuthSettings; 认知用户; 受保护的重写异步任务OnInitializedAsync { string key=Microsoft.AspNetCore.Components.WebAssembly.Authentication.CachedAuthSettings; string authSettingsRAW=等待JSRuntime .InvokeAsyncsessionStorage.getItem,键; authSettings=JsonSerializer.DeserializeauthSettingsRAW; 字符串userRAW=await JSRuntime.InvokeAsyncsessionStorage.getItem,authSettings?.OIDCUserKey; user=JsonSerializer.DeserializeuserRAW; } 公共类缓存设置 { 公共字符串授权{get;set;} 公共字符串metadataUrl{get;set;} 公共字符串客户端\u id{get;set;} 公共字符串[]默认范围{get;set;} 公共字符串重定向_uri{get;set;} 公共字符串post\u logout\u redirect\u uri{get;set;} 公共字符串响应类型{get;set;} 公共字符串响应模式{get;set;} 公共字符串作用域{get;set;} 公共字符串OIDCUserKey=>$oidc.user:{authority}:{client_id}; } 公共类认知用户 { 公共字符串id_标记{get;set;} 公共字符串访问\u令牌{get;set;} 公共字符串刷新\u标记{get;set;} 公共字符串标记\u类型{get;set;} 公共字符串作用域{get;set;} 公共int在{get;set;}处过期 } }
如果我直接尝试使用JSRuntme.InvokeAsync将字符串转换为类,我会遇到序列化错误,但它与JsonSerializer配合使用效果很好,这就是为什么您会看到这似乎是额外的一步。

我想这里的答案都没有用,对吗?我们要删除它们吗?我想这里的答案都没有用,对吧?我们要删除它们吗?这不适用于最新版本和.net5@Inaie,实际上它确实有效,我只是用.NET5测试它。您确定要使用OIDC身份验证吗?这不适用于最新版本和.net5@Inaie,实际上它确实有效,我只是用.NET5测试它。您确定要使用OIDC身份验证吗?