Les*_*ter 3 c# asp.net oauth-2.0 postman openid-connect
我有一个 ASP.NET MVC 应用程序,需要从Private OpenID Connect (OIDC) Provider集成 OpenID Connect 身份验证,流程包含以下步骤:
用户点击登录
然后我将需要使用code上面的并HTTP POST调用私有 ODIC 令牌端点以获取该用户的访问令牌。
所以,我questions #1是:如何在 c# asp.net 应用程序中实现这一点?
另外,我在邮递员“获取新访问令牌”中尝试了这个,我得到了令牌。
正如您在我提供所有参数并单击“请求令牌”后所看到的那样,它会弹出登录窗口,
登录成功后显示token

我的意思questions #2是:与问题#1 类似,是否可以在 c# asp.net 应用程序中实现它?
就像在 asp.net mvc 应用程序中一样,在第一个图像中添加一个带有 url 的链接按钮,当用户单击时,它将使用 将其重定向回 myapp code,然后使用此代码在stpe3 中进行 HTTP POST 调用。
你可以在 GitHub 上找到一个开源示例。该许可证非常宽松,并且有据可查。我已经在各种研讨会和培训中使用过它,所以大部分错误都已经解决了。我建议你深入研究。不过,为了完整起见,我将在这里描述一般过程,并将其用作解释的基础。
任何实现 OpenID Connect 代码流的 Web 应用程序都将包括两个部分:
执行这两件事的应用程序称为“客户端”或“依赖方”。此客户端使用 OpenID Connect 协议与之通信的对象称为 OpenID Connect 提供程序 (OP),通常也称为身份提供程序 (IdP)。
客户端实现的第一部分将显示一个包含按钮的视图。此按钮将是典型的“登录”或“登录”按钮。请注意,这是可选的,如果应用程序检测到用户没有会话,它可能会立即将用户重定向到 OP。但是,鉴于您上面的问题,您的情况并非如此,客户端将首先呈现显示此类按钮的视图。视图可能如下所示:
<div>
@if(Session.Count == 0) {
<p>
This is a demo application to demonstrate the use for OAuth2
and OpenID Connect.
</p>
<p>
Pressing Sign In will redirect you to @ViewData["server_name"]
and authorize the application to access your profile info. The
data will only be used to demonstrate the possibilities of the
OpenID Connect protocol and will not be stored. Be sure to
revoke access when you are satisfied.
</p>
<div>
<a href="/login">Sign In</a>
</div>
} else {
// ...
}
</div>
Run Code Online (Sandbox Code Playgroud)
该视图将由一个非常基本的控制器呈现,该控制器连接在Global.asax.cs. 单击登录按钮后,OpenID Connect 部分将启动。处理此请求的控制器将简单地重定向到 OP 的授权端点。在最基本的情况下,这可能如下所示:
public class LoginController : Controller
{
private static string start_oauth_endpoint = Helpers.Client.Instance.GetAuthnReqUrl();
public ActionResult Index()
{
return Redirect(start_oauth_endpoint);
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的部分是如何获得授权端点。这可以是硬编码、在 中定义Web.config或从 OP 的元数据中获得。在我上面引用的示例中,它在应用程序启动时获取 OP 的元数据。这是在AppConfig位于App_StartWeb 应用程序的目录中完成的。这将向发行者 ID(位于Web.config)中执行 HTTP GET 请求/.well-known/openid-configuration。在应用程序启动时获取此元数据而不是将其全部放入配置中的原因是为了减少 OP 和客户端的耦合。
上面截图中执行的重定向将有一些重要的查询字符串参数。其中一些将在设计时已知,并将被硬编码。其他人将在Web.config. 有些将在运行时动态计算。下面列出了这些:
client_idresponse_typecode于您的情况。scope
openid.redirect_uri
也可以发送其他请求参数。为了帮助您确定要发送的内容以及它们对流程的影响,请查看 oauth.tools。这就像“OAuth 和 OpenID Connect 的邮递员”。这是梦幻般的; 你会喜欢的。在那里,您可以使用各种参数形成各种 OAuth 和 OpenID Connect 流。
一旦重定向到 OP,用户将进行身份验证。用户可能还必须同意客户端访问其受保护资源。在任何情况下,OP 都会在此之后将用户重定向到回调。这是实现的第二部分。
在这里,我们将有一个CallbackController(或类似的东西)。它看起来像这样(以最简单的形式):
public class CallbackController : Controller
{
public ActionResult Index()
{
try
{
string responseString = Helpers.Client.Instance
.GetToken(Request.QueryString["code"]);
SaveDataToSession(responseString);
}
catch (Exception e)
{
Session["error"] = e.Message;
}
return Redirect("/");
}
}
Run Code Online (Sandbox Code Playgroud)
此代码段的重要部分是它code从查询字符串中获取,并向 OP 的令牌端点(也通过解析 OP 的元数据定位)发出 HTTP POST 请求。如果成功,它将在会话中保存响应以供以后使用。该GetToken方法将如下所示:
public String GetToken(String code)
{
var values = new Dictionary<string, string>
{
{ "grant_type", "authorization_code" },
{ "client_id", client_id},
{ "client_secret", client_secret },
{ "code" , code },
{ "redirect_uri", redirect_uri}
};
HttpClient tokenClient = new HttpClient();
var content = new FormUrlEncodedContent(values);
var response = tokenClient.PostAsync(token_endpoint, content).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
return responseContent.ReadAsStringAsync().Result;
}
throw new OAuthClientException("Token request failed with status code: " + response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)
这会将代码发送到 OP 并获取访问令牌、ID 令牌和刷新令牌作为交换。这段代码的重要部分是:
grant_Type是送花儿给人 authorization_code。client_id在请求中包含与先前一起发送的请求以及client_secret表单元素中的秘密。在上面的示例中,我重定向回默认值HomeController. 现在,执行 if 语句的 else 条件。在这里,它可以找到令牌:
<div>
@if(Session.Count == 0) {
// ...
} else {
@if(Session["id_token"] != null) {
<div>
ID Token:<br>
<pre>@Session["id_token"]</pre>
</div>
}
@if(Session["access_token"] != null) {
<div>
Access Token:<br>
<pre>@Session["access_token"]</pre>
</div>
}
@if(Session["refresh_token"] != null) {
<div>
Refresh Token:<br>
<pre>@Session["refresh_token"]</pre>
</div>
}
}
</div>
Run Code Online (Sandbox Code Playgroud)
这个例子比这更复杂,但它希望能给你一个想法。仔细阅读,检查自述文件,并乐于了解有关 OpenID Connect 的更多信息!
小智 5
没有足够的声誉来添加评论到 IdentityServer4 答案,所以我只是在这里提到它。
IS4 将不再免费用于商业用途: IdentityServer 的未来
当前版本 (IdentityServer4 v4.x) 将是我们作为免费开源开发的最后一个版本。我们将继续支持 IdentityServer4,直到 2022 年 11 月 .NET Core 3.1 生命周期结束。
为了继续我们的工作,我们成立了一家新公司 Duende Software,IdentityServer4 将更名为 Duende IdentityServer。Duende IdentityServer 将包含所有新功能,并将针对 .NET Core 3.1 和 .NET 5(以及更高版本)。
该新产品将保持开源状态,但将提供双重许可证(RPL 和商业许可证)。如果您也在做免费的开源工作,RPL(互惠公共许可证)将使 Duende IdentityServer 保持免费。如果您在商业场景中使用Duende IdentityServer,则需要商业许可证。我们提供多种方式来许可 Duende IdentityServer,以适应不同的公司规模和使用模式。包含 RPL 许可证对我们来说很重要,因为它使我们能够认识到开源社区和我们的贡献者并表达我们的谢意。
| 归档时间: |
|
| 查看次数: |
5921 次 |
| 最近记录: |