将 SAML 身份验证添加到 .net WebAPI

2024-01-21

我需要将 SAML 身份验证添加到我的 Web 应用程序(WebAPI 后端/Angular 前端),并使用 Azure AD 作为我的身份提供商。

我计划使用 Sustainsys.Saml2 库,但我不确定如何正确使用该库提供的方法。

我已将 Web 应用程序添加为 Azure AD 上的企业应用程序,并执行了必要的 SSO SAML 配置。

我在 web.config 中配置了 Sustainsys,如下所示:

<sustainsys.saml2 entityId="https://myWebApp/api/saml/login" returnUrl="https://myWebApp/">
  <identityProviders>
    <add 
      entityId="https://sts.windows.net/36tg486z-9l1f/" 
      signOnUrl="https://login.microsoftonline.com/36tg486z-9l1f/saml2"
      metadataLocation="https://login.microsoftonline.com/36tg486z-9l1f/federationmetadata/2007-06/federationmetadata.xml?appid=82fc2g56-2as2"
      allowUnsolicitedAuthnResponse="true"
      loadMetadata="true"
      binding="HttpPost"
    >
    </add>
  </identityProviders>
    <serviceCertificates>
        <add fileName="~/App_Data/Sustainsys.Saml2.Tests.pfx" />
  </serviceCertificates>
</sustainsys.saml2>

我的想法是写两个API:

1 - 执行登录 Azure AD 的 API:

[HttpGet]
[Route("api/saml/signIn")]
[ResponseType(typeof(void))]
public HttpResponseMessage SignIn()
{
  var context = new HttpContextWrapper(HttpContext.Current);
  HttpRequestBase request = context.Request;

  var opt = Sustainsys.Saml2.Configuration.Options.FromConfiguration;
  var result = CommandFactory.GetCommand(CommandFactory.SignInCommandName).Run(request.ToHttpRequestData(), opt);
  var response = Request.CreateResponse(result.HttpStatusCode);

  if (!string.IsNullOrEmpty(result.SetCookieName))
  {
    var protectedData = HttpRequestData.ConvertBinaryData(MachineKey.Protect(result.GetSerializedRequestState(),HttpRequestBaseExtensions.ProtectionPurpose));

    var cookie = new CookieHeaderValue(result.SetCookieName, protectedData) { HttpOnly = true };
    var cookies = new List<CookieHeaderValue>() { cookie };
    response.Headers.AddCookies(cookies);
  }

  response.Headers.Location = result.Location;
  return response;
}

2 - 从 Azure AD 接收响应并读取 SAML 令牌内声明的 API:

[HttpPost]
[Route("api/saml/acs")]
[ResponseType(typeof(result))]
public HttpResponseMessage Acs()
{
  var context = new HttpContextWrapper(HttpContext.Current);
  HttpRequestBase request = context.Request;

  var opt = Sustainsys.Saml2.Configuration.Options.FromConfiguration;
  var result = CommandFactory.GetCommand(CommandFactory.AcsCommandName).Run(request.ToHttpRequestData(), opt);

  // ... read claims ...

  // ... build [LoginResult] with claims ...
  var response = Request.CreateResponse(result.HttpStatusCode, [LoginResult]);

  response.Headers.Location = new Uri(result.Location.AbsoluteUri);

  return response;
}

这是使用 SustainSys 添加 SAML 身份验证的正确方法吗?


以下是使用 SustainSys 存根 Idp 的 WebApi + Angular Spa 的工作示例。它还可以与 Azure AD 配置一起使用。

https://github.com/hmacat/Saml2WebAPIAndAngularSpaExample https://github.com/hmacat/Saml2WebAPIAndAngularSpaExample

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 SAML 身份验证添加到 .net WebAPI 的相关文章

随机推荐

  • ClickOnce 更新时会删除我的本地数据库。如何不删除?

    我正在使用 ClickOnce 来部署我的应用程序 当应用程序第一次运行时 如果数据库不存在 它会创建一个 问题是 当我更新时 它会删除本地数据库 有没有办法告诉它忽略它 我想你把它放在应用程序目录中 不要 把它放进去Environment
  • 如何使用 Worklight 传输媒体文件

    使用 Worklight 适配器传输媒体 照片或电影 的正确方法是什么 我通过适配器发送照片并收到错误 表格太大 超出最大尺寸 我读到我需要通过 Jetty 更改表单大小 但我将部署应用程序的服务器不会是码头 那么我要做什么 shell 呢
  • Java 中的 Kerberos 身份验证 - java 中的“登录”操作是否等于“kinit”?

    我在 Java 中使用 GSSAPI 以便使用 Kerberos 身份验证登录到 LDAP 服务器 我是 Kerberos 的新手 所以如果这是一个明显的问题 我很抱歉 但我在互联网上找不到足够清晰的内容 我执行以下步骤 通过设置系统属性定
  • 同一个套接字上可以进行多少个异步套接字请求?

    当我在套接字上调用 BeginSend 时 我传递一个委托 该委托将在数据发送后 由不同的线程 调用 如果我在第一次尚未 回调 时再次调用 BeginSend 会发生什么 发送数据的正确行为是什么 执行 BeginSend 然后在回调中执行
  • linux 上的 Dart 抛出错误:GLIBC_2.14 GLIBC_2.15 not found

    我在 Google Compute Engine 上运行 Debian 7 2 尽管我怀疑 Centos Red Hat 和 Amazon Linux AMI 都有同样的问题 从 下载 64 位 Linux 版本的 Dart SDK 后这一
  • Gunicorn 工作线程和线程

    就 Gunicorn 而言 我知道有各种工作线程类 但对于本次对话 我只关注同步和异步类型 据我了解 sync workers 2 cpu 1 worker class sync async gevent workers 1 worker
  • 当我期望它输出 1,2,3 时,为什么此代码输出“49,50,51”

    package com company import java util Scanner public class Main public static void main String args System out println pl
  • 在 Docker Alpine 上安装 numpy

    我正在尝试在基于 Alpine 3 1 的 docker 容器中安装 numpy 我正在使用以下 Dockerfile FROM alpine 3 1 RUN apk add update make cmake gcc g gfortran
  • 如何使用 alembic --autogenerate 忽略某些模式

    我有一个图书馆 它是一个更大项目的一部分 该库在与较大项目共享的 PostgreSQL 数据库中使用自己的模式 我想用alembic revision autogenerate仅生成库架构的迁移并忽略对主 默认架构中表的更改 有什么选择可以
  • Zebra LP2844 停止响应 ZPL 命令或文件

    我向打印机发送了几个 zpl 文件来测试它 它工作得很好 之后 我从 UPS 接收 Base64 编码的 zpl 数据 创建一个文件并通过 Java 小程序将其发送到打印机 现在我发送给它的任何 zpl 命令或文件都不起作用 我将其置于诊断
  • MVC Core 如何强制/设置所有操作的全局授权?

    如何强制 设置 MVC Core 中所有操作的全局授权 我知道如何注册全局过滤器 例如我有 Setup cs services AddMvc options gt options Filters Add new RequireHttpsAt
  • 学说无关系连接[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以在不使用关系的情况下连接 ORM 中的表 https stackoverflow com questions 2203027 is this possible to join tables i
  • Golang gin gonic Web框架代理路由到另一个后端

    如何将一些路由的代理 Web 请求反向到另一个后端杜松子酒 https gin gonic github io gin Golang 网络框架 有没有办法直接在Handle函数中转发如下图 router gin New router Han
  • maven中package和groupId有什么区别

    我了解这些条款 groupId artifactId and version 在阅读有关package 我可以看到它是您的根包的名称 默认值是groupId你之前进入过 在这种情况下 有什么区别package and groupId 我想它
  • Magento 1.9 - OroCRM 更新同步无法正常工作

    从 magento 1 9 更改客户详细信息后 更改未反映在 OroCRM 上几乎 2 天后仍然没有更改未反映在 OroCRM 上 如何同时在每个更改中进行自动同步 None
  • 无法使用 UPDATE 更改 MySQL 上的用户密码

    在 MySql 5 7 17 下 上述指令不起作用 并且我总是没有收到任何反馈或以下错误消息 错误 1064 42000 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 UPDATE mysql user
  • 如何使用 ps -axl 查找 Linux 上运行的 Java 线程?

    我有一个正在运行的 JVM 有两个线程 是否可以使用 ps axl 在我的 Linux 操作系统上查看这些正在运行的线程 我试图找出操作系统赋予我的线程的优先级 有关此其他问题的更多信息here https stackoverflow co
  • Error 方法内的 fmt.Sprint(e) 产生的无限循环

    根据四十四十的回复这个问题 https stackoverflow com questions 27474907 error infinite loop fmt Sprint e 将会通知e Error 转换值e to a string 如
  • 更改 pandas 中箱线图的面色

    我需要更改使用绘制的箱线图的颜色pandas实用功能 我可以使用以下命令更改大多数属性color争论但不知道如何改变facecolor盒子的 有人知道该怎么做吗 import pandas as pd import numpy as np
  • 将 SAML 身份验证添加到 .net WebAPI

    我需要将 SAML 身份验证添加到我的 Web 应用程序 WebAPI 后端 Angular 前端 并使用 Azure AD 作为我的身份提供商 我计划使用 Sustainsys Saml2 库 但我不确定如何正确使用该库提供的方法 我已将