2015-10-14 62 views
2

我需要從Asp.Net用戶授權系統獲取UserId,因爲我的大部分數據都存儲在SQL中,並使用UserId作爲用戶擁有此數據的標記。使用Owin OAuth 2.0我無法使用Identity獲取UserId,它返回null。所以我想出了這個解決方案:您是否可以在Owin OAUTH 2令牌中存儲UserId?

令牌提供商

identity.AddClaim(new Claim("user_id", user.Id)); 

API

ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal; 
var userName = principal.Claims.Where(c => c.Type == "user_id").Single().Value; 

簡單的API代碼

var userName = ClaimsPrincipal.Current.Claims.First(c => c.Type == "user_id").Value; 

這種方法是否適合企業業務級應用程序,它是安全的,安全的和強大的?或者你會(也許)建議其他的東西?

我只是不喜歡在這個功能是(可能)由Microsoft.AspNet.Identity(.NET本身)提供的時候在標記內部傳遞UserId的想法,但由於我無法使它工作,這是我現在唯一的選擇。

無論如何,我部分使用this great tutorial repository的代碼。正如你所看到的,這個控制器已經註釋了使用Identity獲得UserId的行。但是這對我不起作用,所以我正在使用另一條使用聲明的註釋行。

+0

你在哪裏把這個代碼兩行,在控制器或過濾器? –

+0

在控制器(ApiController) – EwanCoder

+0

每個控制器都會有'用戶'屬性,所以改變你的第一行代碼:'ClaimsPrincipal principal = User作爲ClaimPrincipal;'然後它工作 –

回答

4

因爲您使用的是OWIN,所以我會假設您使用的是ASP.NET Identity。您不需要將用戶標識作爲索賠存儲。你可以把它任何時候你需要通過:

User.Identity.GetUserId() 

如果智能感知怪胎,你只需要添加Microsoft.AspNet.Identity命名空間。

+1

好吧,我**多次嘗試**。這包括多次重新安裝Microsoft.AspNet.Identity.Core包,同時使用Microsoft.AspNet.Identity,事情是'User.Identity.GetUserId()'返回null。是的,我的控制器完全由[Authorize]保護。 我也嘗試過安裝Microsoft.AspNet.Identity.Owin軟件包,結果相同。 – EwanCoder

+0

如果它返回null,這意味着用戶是匿名的,即未驗證。乾淨利落。試圖從索賠中獲得ID不會有幫助,因爲它在那裏也是空的。 –

+0

另外,如果它是'null',它可能是你已經在'startup.cs'中正確配置了認證。 –

0

我假設身份對象在下面的代碼是ClaimsIdentity。你如何以及在哪裏初始化這個對象?

identity.AddClaim(new Claim("user_id", user.Id)); 

如果你看一下這是一種Web應用程序在Visual Studio中會有一個IdentityModel類在這裏你可以看到如下的代碼生成的,當你在ASP.Net身份簽到這就是所謂的默認模板。

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 

而且這是負責添加默認權利要求數據並且還可以擴展這個添加像用戶PHONENUMBER附加信息(主要是爲了避免往返於數據庫,並存儲附加用戶信息,如權利要求)。

那麼你什麼時候創建標識對象?

如果你是問題是否可以添加更多的信息作爲索賠我想這應該是好的。還有什麼輸出

identity.GetUserId(); 

在你的情況?使用ASP.Net識別系統調用GenerateUserIdentityAsync在內部調用UserClaimsPrincipalFactory類中定義的方法CreateAsync

當您註冊 -

http://anthonychu.ca/post/aspnet-identity-20---logging-in-with-email-or-username/

更新1說明,您可以進一步編寫自己的IdentityExtensions類。這裏是代碼https://github.com/aspnet/Identity/blob/daa50df87feb9f1b59858a22f00a2984996738c6/src/Microsoft.AspNet.Identity/UserClaimsPrincipalFactory.cs。如果你看一下這個方法它實際上你在做什麼明確

var id = new ClaimsIdentity(Options.Cookies.ApplicationCookieAuthenticationScheme, Options.ClaimsIdentity.UserNameClaimType, Options.ClaimsIdentity.RoleClaimType); 
id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId)); . 

所以我相信這就是你還需要做

+0

GetUserId()的輸出爲null。我有點想出如何簡化我的代碼:'ClaimsPrincipal.Current.Claims.First(c => c.Type ==「userId」)。Value;'也可以。我不是在任何地方創建身份對象,也不是在任何地方聲明,我甚至在我的API控制器中沒有數據庫連接。 API和令牌服務器完全分離,其中令牌服務器(帶有數據庫連接和AccountController)給出令牌和聲明,API服務器僅提供基於令牌的授權(資源訪問) – EwanCoder

+0

那麼代碼中的身份對象的類型是什麼? identity.AddClaim? –

+0

ClaimsIdentity(OAuthGrantResourceOwnerCredentialsContext context.Options.AuthenticationType) – EwanCoder

相關問題