DotNetOpenAuthを使用してOAuth 2を構築する.0ライセンスフレームワーク-Demoコードの簡単な説明
13368 ワード
この間、OAuth 2のサンプルコードとして一部のコードを勝手に抽出し、いくつかの箇所で困っていることがありますが、以下のように説明します.
これは、ライセンスサービス側の主なコードです.AuthorizeUrlとuserkeyはそれぞれどういう意味ですか?
ここでは私の会社の具体的な状況について簡単に言えば、ユーザー権限の具体的なロジックは、別のサイトによって許可されます.(AuthorizeUrlは、説明を容易にするため、Aサイトと呼ぶ)ガイドのため、ここのコードは主にジャンプの役割を果たしている.DotNetOpenAuthの公式Demoを見ると、ライセンスサービス側にはログインページ、ライセンスページなどがあり、本質は同じで、2つのサイトに分割されているだけである.OAuthパラメータを除いて、ここでは他のパラメータが伝達される可能性があるので、を使用してQueryParametersで区別し、クエリー文字列の2つの部分をそれぞれ構築します.OAuthパラメータはcallbackアドレスパラメータに付加され、ユーザーが許可するとAサイトからアドレス(ここではactionが示すアドレス)にジャンプし、ブラウザの許可コードに戻ります.
userkeyについては、解読の手順があります(47行目)、so、これはセキュリティの問題を考慮したものに違いありません.会社のビジネスロジックの多くはuseridを使用してユーザーを表示し、自己成長intタイプであり、ユーザーがAサイトの許可を得てブラウザcallbackを通過したとき、useridはアドレスバーでキャプチャすることができ、そのアドレスをコピーして勝手にuserid値を変更すれば、対応するユーザーが許可していない場合にアクセスを得る可能性が高い権限.したがって、useridを直接渡すことは許されず、対称暗号化されていることがuserkeyの由来です.認証ロジックが独立したサイトに分割されていない場合は、このような状況はありません.
仕事が忙しいので、友达が质问したところだけ说明します.他に質問があれば、不定期に更新することをお知らせください.
1 public class OAuthController : Controller
2 {
3 private static string _authorizeUrl = ConfigurationManager.AppSettings["AuthorizeUrl"];
4 private static string[] _queryParameters = new string[] { "client_id", "redirect_uri", "state", "response_type", "scope" };
5 private readonly AuthorizationServer _authorizationServer = new AuthorizationServer(new OAuth2AuthorizationServer());
6
7 [AcceptVerbs(HttpVerbs.Get)]
8 public ActionResult Authorize(string userkey)
9 {
10 var pendingRequest = this._authorizationServer.ReadAuthorizationRequest(Request);
11 if (pendingRequest == null)
12 {
13 throw new HttpException((int)HttpStatusCode.BadRequest, "Missing authorization request.");
14 }
15
16 if (string.IsNullOrEmpty(userkey))
17 {
18 string url = _authorizeUrl, callback = Request.Url.GetLeftPart(UriPartial.Path);
19 StringBuilder querystring = new StringBuilder(string.Format("client_id={0}&", HttpUtility.UrlEncode(this.Request.QueryString["client_id"]))), callbackQuery = new StringBuilder();
20 foreach (string key in this.Request.QueryString.Keys)
21 {
22 if (!_queryParameters.Contains(key))
23 querystring.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
24 else
25 callbackQuery.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(this.Request.QueryString[key])));
26 }
27 if (callbackQuery.Length > 0)
28 {
29 callback += ("?" + callbackQuery.ToString().TrimEnd('&'));
30 querystring.Append(string.Format("callback={0}&", HttpUtility.UrlEncode(callback)));
31 }
32 if (querystring.Length > 0)
33 {
34 url += ("?" + querystring.ToString().TrimEnd('&'));
35 }
36 return Redirect(url);
37 }
38 else
39 {
40 using (var db = new OAuthDbContext())
41 {
42 var client = db.Clients.FirstOrDefault(o => o.ClientIdentifier == pendingRequest.ClientIdentifier);
43 if (client == null)
44 throw new AuthorizeException("40143", " ");
45 else
46 {
47 var user = DESCrypt.Decrypt(userkey, client.ClientSecret);
48 var approval = this._authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, user);
49 var response = this._authorizationServer.Channel.PrepareResponse(approval);
50 return response.AsActionResult();
51 }
52 }
53 }
54 }
55
56 public ActionResult Index()
57 {
58 ViewBag.Body = "Welcome To OAuth2.0";
59 return View();
60 }
61 }
これは、ライセンスサービス側の主なコードです.AuthorizeUrlとuserkeyはそれぞれどういう意味ですか?
ここでは私の会社の具体的な状況について簡単に言えば、ユーザー権限の具体的なロジックは、別のサイトによって許可されます.(AuthorizeUrlは、説明を容易にするため、Aサイトと呼ぶ)ガイドのため、ここのコードは主にジャンプの役割を果たしている.DotNetOpenAuthの公式Demoを見ると、ライセンスサービス側にはログインページ、ライセンスページなどがあり、本質は同じで、2つのサイトに分割されているだけである.OAuthパラメータを除いて、ここでは他のパラメータが伝達される可能性があるので、を使用してQueryParametersで区別し、クエリー文字列の2つの部分をそれぞれ構築します.OAuthパラメータはcallbackアドレスパラメータに付加され、ユーザーが許可するとAサイトからアドレス(ここではactionが示すアドレス)にジャンプし、ブラウザの許可コードに戻ります.
userkeyについては、解読の手順があります(47行目)、so、これはセキュリティの問題を考慮したものに違いありません.会社のビジネスロジックの多くはuseridを使用してユーザーを表示し、自己成長intタイプであり、ユーザーがAサイトの許可を得てブラウザcallbackを通過したとき、useridはアドレスバーでキャプチャすることができ、そのアドレスをコピーして勝手にuserid値を変更すれば、対応するユーザーが許可していない場合にアクセスを得る可能性が高い権限.したがって、useridを直接渡すことは許されず、対称暗号化されていることがuserkeyの由来です.認証ロジックが独立したサイトに分割されていない場合は、このような状況はありません.
仕事が忙しいので、友达が质问したところだけ说明します.他に質問があれば、不定期に更新することをお知らせください.