前一篇關於anti-forgery token問題的博文提到我們可以通過修改AntiForgeryConfig.UniqueClaimTypeIdentifier屬性來避免AntiForgeryToken生成的問題。但是也許你編譯運行後又得到了這樣一個錯誤: A claim of type 'htt...
前一篇關於anti-forgery token問題的博文提到我們可以通過修改AntiForgeryConfig.UniqueClaimTypeIdentifier屬性來避免AntiForgeryToken生成的問題。但是也許你編譯運行後又得到了這樣一個錯誤:
A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' was not present on the provided ClaimsIdentity.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: A claim of type 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' was not present on the provided ClaimsIdentity.
Source Error:Line 4: using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
Line 5: {
Line 6: @Html.AntiForgeryToken()
Line 7:
Line 8: <ul class="nav navbar-nav navbar-right">
這說明做身份驗證的STS (比如 ADFS)沒有提供NameIdentifier的信息。以ADFS為例,什麼是NameIdentifier,看圖
NameIdentifier在ADFS中就是“Name ID”。這是我的ADFS上配置的一條”Claims Rule“,將Active Directory用戶的E-mail地址映射為Claim Based Identity中的Name ID。這裡要註意,圖中左邊的LDAP Attribute必須要有值,否則即使我們配置了一條映射,在用戶登陸後ADFS發出的Claims中也沒有我們要的數據,比如本例中的Name ID。
如何確定LDAP Attribute也沒有值?打開Active Directory的用戶屬性界面,確認我們需要的屬性(比如E-mail)不為空。
如果不清楚後端的STS到底提供了哪些可用的Claims Types,可以在頁面添加如下的代碼來顯示當前所有拿到的身份驗證的信息
@if (Request.IsAuthenticated)
{
<ul>
@foreach (var claim in ((System.Security.Claims.ClaimsIdentity)User.Identity).Claims)
{
<li>Issuer:@claim.Issuer OriginalIssuer:@claim.OriginalIssuer Value:@claim.Value</li>
}
</ul>
}