小编Ulr*_*sen的帖子

Azure AD 令牌中的哪些 JWT 声明可以安全地用于用户映射?

我们使用 OAuth 2.0 从 Azure AD 获取 JWT 令牌。在我们的应用程序中,我们使用“upn”声明的值来识别关联的内部用户名。

Azure AD 令牌参考将upn声明记录为“用户主体名称”,据我所知,这是遵循 addr-spec 格式的用户名(即 user@domain)。这对于在 Azure AD 租户中创建的用户非常有效。然而,令我惊讶的是,如果经过身份验证的用户从不同的 AD 同步,则upn声明似乎消失了。这种行为似乎没有在任何地方记录。

  1. 在哪里可以找到有关何时保证upn位于令牌中的文档?
  2. 我可以使用哪些可靠的替代声明?最好保证声明采用“用户/域”的形式,因为它最符合我们的模型。我考虑过以下几点:
    • unique_name:我只观察到它等于upn,但我不确定它来自哪里。令人困惑的是,令牌参考说:该值不能保证在租户内是唯一的,并且设计为仅用于显示目的。(强调我的)
    • email:这似乎也等于upn,但同样,它来自哪里?在管理门户中,我尝试在与用户关联的每个电子邮件相关字段中放置不同的值,但它们似乎都没有传播到此声明。因此看来该字段实际上并不是电子邮件

我想绝对确定我们的应用程序能够处理 Azure AD 颁发的所有令牌,因此我对于使用上述任何声明都犹豫不决,除非我有一些文档可以解释其实际语义。

oauth-2.0 jwt azure-active-directory openid-connect

9
推荐指数
1
解决办法
2271
查看次数

在Kotlin中,如何使用零构造函数参数声明数据类?

假设我想为整数列表声明一个简单的代数数据类型:

sealed class IntList
data class Cons(val head: Int, val tail: IntList): IntList()
data class Nil() : IntList()
Run Code Online (Sandbox Code Playgroud)

但是,最后一个声明会导致错误

数据类必须至少有一个主构造函数参数

  1. 为什么会出现这种限制?查看文档,似乎没有很好的技术理由要求数据类构造函数是非空的.
  2. 是否有可能表达无需构造函数而无需编写大量的样板代码?如果我将最后一个声明更改为类似的

    sealed class Nil() : IntList()
    
    Run Code Online (Sandbox Code Playgroud)

    然后我失去了免费的实现hashCode()equals()免费data class声明.

编辑

Alex Filatov给出了一个很好的简短解决方案.显然,您永远不需要多个实例Nil,因此我们可以只定义一个单例对象

object Nil : IntList()
Run Code Online (Sandbox Code Playgroud)

但是,如果我们的列表由类型参数参数化,我们会怎么做?也就是说,现在我们定义的前两行是

sealed class List<A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
Run Code Online (Sandbox Code Playgroud)

我们不能声明NilList<A>any 派生的多态单例对象A,因为我们必须A在声明时提供具体类型.解决方案(取自这篇文章)是声明A为协变类型参数并声明为如下Nil的子类型List<Nothing>:

sealed class List<out A>
data …
Run Code Online (Sandbox Code Playgroud)

kotlin

9
推荐指数
1
解决办法
1578
查看次数

在回发之间丢失了ascx的Viewstate

在我的ASP.NET应用程序中,我使用LoadControl动态加载.ascx,使用以下模式:

var ctrl = LoadControl("/path/to/control.ascx");
((ControlType)ctrl).SomeProperty = someData;
placeholder.Controls.Add(ctrl);
Run Code Online (Sandbox Code Playgroud)

我添加的控件将SomeProperty属性值直接保存到ViewState,如下所示:

public int? SomeProperty
{
    get { return (int?)ViewState["SomeProperty"]; }
    set { ViewState["SomeProperty"] = value; }
}
Run Code Online (Sandbox Code Playgroud)

在那之后,ascx控件独自生活,一切都很好,直到回发发生.当页面回发时,突然视图状态为空!我怀疑这是因为我在将实例化的ascx添加到我的页面之前操纵了ViewState.此外,我可以通过在Page_Load()我的ascx控件的方法中添加以下行来防止ViewState丢失:

SomeProperty = SomeProperty;
Run Code Online (Sandbox Code Playgroud)

我必须为每个属性执行上述操作以确保保留ViewState.现在,有更好的方法吗?在将实例化的.ascx添加到页面后操作ViewState不是一个选项 - 我需要Page_Init()Page_Load()方法中的ViewState的内容,这是在我将.ascx添加到我的页面时触发的.

谢谢.

asp.net viewstate

6
推荐指数
1
解决办法
1万
查看次数