首页 > 其他分享 >使用Authorization Code保护Interactive Applications

使用Authorization Code保护Interactive Applications

时间:2022-10-04 21:13:25浏览次数:81  
标签:Code 重定向 认证 Applications mvc 服务器 options Authorization 客户端

上一篇介绍了ClientCredentials这一最简单的grant type,通常应用在machine对machine的通信环境有安全保障的场景下。

对于Web Application,SAP以及native/mobile Application等有终端用户参与登录的场景下, 更多使用Authorization Code这一grant type。

在微服务架构下,一个公共的identity server也避免了每个微服务/应用自己重复实现auth功能,也保障了登录相关UI的一致用户体验。

 

 

什么叫授权码(Authorization Code)?

上一篇ClientCredentials 很容易理解,ClientCredential(clientId+ secret)相当于用户名密码换取access token。

在Authorization Code这授权工作流(flow) 中,到底哪一步用到了Authorization code呢?

简单地说,用户认证成功之后,授权服务器不会马上返回AccessToken,而是先返回一个授权码(code),然后浏览器再通过code再去获取Token。

这个code,只能使用一次,而且有时效性,所以是非常安全的。

 

 

步骤如下:

  1. 用户通过浏览器访问mvc
  2. mvc 将用户(浏览器)重定向redirect到认证服务器
  3. 用户在认证服务器上完成认证(输入用户名密码/扫描...)
  4. 认证服务器将用户导向浏览器事先指定的"重定向URI"(redirect_uri),同时附上一个授权码(code)。
  5. 浏览器收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端(mvc)的后台的服务器上完成的,对用户不可见。
  6. 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token);
  7. 客户端返回cookie给浏览器,后者将token保存在本地cookie中。后续用户再需访问mvc(受保护资源 )时,直接在请求中带上AccessToken即可;

 

(A)用户访问客户端(mvc web application),后者将前者导向认证服务器。

(B)用户在认证服务器上完成认证(输入用户名密码/扫描...,并授权)。

(C)认证服务器将用户导向客户端(mvc)事先指定的"重定向URI"(redirect_uri),同时附上一个授权码。

(D)客户端(mvc)收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端(mvc)的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端(mvc)发送访问令牌(access token)和更新令牌(refresh token)

   (F) 

 

重定向到IdentityServer

可以看到重定向到IdentityServer请求的URL是 authorization_endpoint (https://localhost:5001/connect/authorize)

附带的参数包括:(也就是在mvc config配置的)

  • client_id,
  • redirect_uri(aka callback URL,通常是固定的 https://localhost:5002/signin-oidc)
  • response_type
  • scope

  

 

 

 

配置mvc 使用了基于cookie的认证方案

将从IdentityServer获取的AccessToken 保存到本地,

options.SaveTokens = true;

 添加 可用于处理Cookies的handler,

.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)

  

 完整的代码如下:

//MVC client Program.cs:

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "oidc";
})
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "https://localhost:5001";

        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code";

        //to pull remaining claims from the UserInfo endpoint 
        options.Scope.Add("profile");
        options.GetClaimsFromUserInfoEndpoint = true;

        options.SaveTokens = true;
    });

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
...

//to ensure the execution of the authentication services on each request
app.UseAuthentication();
app.UseAuthorization();

//navigating to the default controller will trigger authentication handshake
app.MapDefaultControllerRoute().RequireAuthorization();

  

 

 

 

 

 

 

参考

标签:Code,重定向,认证,Applications,mvc,服务器,options,Authorization,客户端
From: https://www.cnblogs.com/leixian/p/16750205.html

相关文章

  • AtCoder Regular Contest 149
    A发现所有数字都相同的数一共只有\(10^6\)种,考虑枚举每种情况,关键在于如何判断一个数\(\bmodm\)是否为\(0\)。考虑\(9\bmod8=1\),而\(99\bmod8=(9\times10+9)\b......
  • AtCoder Beginner Contest 271
    AtCoderBeginnerContest271D-FlipandAdjust一共有\(N\)张牌,每一面都写着一个整数。卡\(i(1\lei\leN)\)前面写着整数\(a_i\),后面写着整数\(b_i\)。你可......
  • [Oracle] LeetCode 160 Intersection of Two Linked Lists
    Giventheheadsoftwosinglylinked-listsheadAandheadB,returnthenodeatwhichthetwolistsintersect.Ifthetwolinkedlistshavenointersectionata......
  • 无重复字符的最长子串 leetcode 3 C++ 滑动窗口
    C++版本的滑动窗口解决方案class Solution {public:    int lengthOfLongestSubstring(string s) {            if(s.empty()) return 0; ......
  • VSCode阅读Linux源码(35)
    环境经测试在以下环境上编译成功或编译失败:Ubuntu2004LTS(非虚拟机,真实系统),Ubuntu2204LTS(VMware虚拟机)环境上编译成功;Ubuntu2004LTS(Hyper-V系统),Ubuntu2204......
  • 项目开发神器VsCode配置指南!(含C++、Python、Java环境配置)
     Datawhale干货 作者:吴忠强,东北大学,Datawhale成员本篇文章虽然是VsCode挂名,但其实介绍了两款神器:Vscode和Vim,这两个结合起来,开发效率蹭蹭蹭!!!之前接触过VsCode但很少......
  • Codeforces Educational Codeforces Round 136 C D
    C一开始没有读懂题意,以为是轮流游戏,看别人翻译才发现先手在下一轮会变为反手,导致搞了半天过不了样例。可以知道如果\(n\)这张牌在Alice手中,则Alice先手打出这张牌必胜。......
  • Codeforces Round #824 (Div. 2)
    CodeforcesRound#824(Div.2)A#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#defineendl'\n'usingnamespacestd;intt,n;inlin......
  • Codeforces Round #824赛时情况&赛后总结
    前两天的CF到今天才总结,还是太鸽了呢赛时首先看了题目,由于英语障碍,我还在看A题时,YSC就已经A了(我还是太逊了)。看懂后,发现A是道水题(正常),快速切掉。随后看B,阅读倒没什么障......
  • AtCoder Regular Contest 137 D
    一道很好的题目,运用了很多不同的技巧。结论1:枚举变换次数\(k\),若\(A_{i}\)对答案有贡献,当且仅当\(C_{n-i+k-1}^{k-1}\equiv1\mod2\)。首先我们可以统计\(A_{p}\)对......