我設置我的HttpListener以允許基本身份驗證和匿名身份驗證。我還爲我的配置添加了一個名爲AuthenticationHandler的新MessageHandler。我的聲明在控制器中的用戶中不可見? (ASP.NET WebAPI OWIN自託管)
public void Configuration(IAppBuilder appBuilder)
{
var listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = AuthenticationSchemes.Basic | AuthenticationSchemes.Anonymous;
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
//...
config.MessageHandlers.Add(new AuthenticationHandler());
appBuilder.UseWebApi(config);
}
AuthenticationHandler
是DelegatingHandler
。我建立了我的權利,身份,主要如下:
if (validCredentials)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, userName),
new Claim(ClaimTypes.AuthenticationMethod, AuthenticationMethods.Password),
};
var roles = user.Roles.ToString().Split(',');
// Make sure to add all the user's roles to the claims
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
var identity = new ClaimsIdentity(claims, Scheme);
var principal = new ClaimsPrincipal(new [] {identity});
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
}
如果我在調試器中我的委託人有我的身份和所有我已經添加了要求檢查Thread.CurrentPrincipal中。 DelegatingHandler內部看起來都很好,但是這些聲明並沒有進入我的控制器。
在我的控制器中,我在功能上有一個簡單的[Authorize(Roles="Admin")]
屬性。但是,如果我在調試器中檢查User
,則列出的唯一要求是用戶名。所以[Authorize]
的作品,[Authorize(Users="admin')]
,但顯然基於角色的身份驗證將無法正常工作。我當然可以在數據庫中查看用戶名,並手動檢查函數中的角色,但這顯然不是正確的方法。我究竟做錯了什麼?
看到這個答案類似的問題[該用戶也遇到你提到了同樣的問題(http://stackoverflow.com/a/12030785/3356508) –
@CallbackKid我看到但是,我是自託管的,所以HttpContext爲null。對我而言,這一定是別的嗎? – bodangly