ASP.NET MVC 5 ve WEB API 2'de oauth2 sunucusu nasıl uygulanır [kapalı]


127

Önce projemin taslağını çıkaracağım:

Stajım için mevcut bir sisteme işlevsellik eklemem gerekiyor. Bir 3. taraf istemci, kullanıcı tarafından OAuth2 aracılığıyla yetkilendirildikten sonra AX Web Hizmetlerinden verilere erişebilmelidir. İstemcinin aramalarını yapabileceği ve AX hizmetlerini arayan bir 'proxy web hizmeti' yapmam gerektiğini anlıyorum, ancak OAuth2 kısmı hakkında biraz emin değilim. Çoğu eğitim ve kılavuz, ASP.NET'in Identity for Facebook veya Google oturumlarını kullanma hakkındadır. Buna ihtiyacım yok, mevcut kimlik bilgilerini kullanmam gerekiyor, bu yüzden kendi OAuth2 hizmetimi yapmam gerekiyor.

Bununla ilgili öğreticiler, kılavuzlar veya açıklamalar bulmakta zorlanıyorum. OAuth2'yi ve ne yapılması gerektiğini anlıyorum, ancak daha önce hiç böyle bir şey yapmadım ve başlamakta zorlanıyorum. Bulduğum şeye en yakın şey bu github repo bağlantısıdır , ancak çözüm geliştirilmiyor.

Aklımdaki şey, müşterilerin (3. taraflar) kendilerini kaydettirebilecekleri ve Müşteri Kimliklerini alabilecekleri bir ASP.NET MVC Web Sitesi yapmaktı. ASP.NET API ile gerekli belirteçleri ve parametreleri alan API'yi oluşturmak ve ardından Dyn AX hizmetlerine erişmek istedim.

Bu doğru mu yoksa tamamen yanlış mıyım? Kendi oauth2 sunucunuzu / hizmetinizi oluşturmayla ilgili herhangi bir yardım veya bağlantı güzel olurdu.


Yanıtlar:


189

Bakacağım, ancak bölüm adlarından, Kimlik ve facebook / google oturum açma kimliği sağlayıcılarına odaklandığı için yine aradığım şey olmadığını düşünüyorum.
Robin

3
Sadece 4. bölüm facebook ve google hakkındadır. İki ay önce bu eğitimlere dayanarak kendi kimlik doğrulama denetleyicimi uyguladım. Ve ben de kendi kullanıcı veritabanımı kullanıyordum.
MichaelS

1
Bir sorum daha var, bu jetonlar nerede saklanıyor? Kimlik bununla tamamen ilgileniyor mu?
Robin

17
@MichaelS blog yazılarıma atıfta bulunduğunuz için teşekkürler, projeniz için faydalı olduğuna sevindim :)
Taiseer Joudeh

@MichaelS Token tabanlı kimlik doğrulama yönteminin geri kalan api için yeterli güvenlik olup olmadığından şüphelendim. çünkü kullanıcının simgesini tarayıcısına alabilirsem. Token istek başlığında saklandığı için başarılabileceğini düşünüyorum Authentication. Get / post / put / delete gibi istediğim her şeyi yapabilirim.
Joe.wang

87

Ayrıca token kısmını nasıl oluşturacağıma dair makaleler bulmakta zorlandım. Asla bulamadım ve kendim yazdım. Yani yardımcı olursa:

Yapılması gerekenler:

  • Yeni bir web uygulaması oluşturun
  • Aşağıdaki NuGet paketlerini yükleyin:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • OWIN startupsınıfı ekle

Ardından index.js, aşağıdaki içeriklerle bir HTML ve JavaScript ( ) dosyası oluşturun:

var loginData = 'grant_type=password&username=test.test@mail.com&password=test123';

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("POST", "/token", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(loginData);
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript" src="index.js"></script>
</body>
</html>

OWIN startupsınıfı şu içeriğe sahip olmalıdır:

using System;
using System.Security.Claims;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using OAuth20;
using Owin;

[assembly: OwinStartup(typeof(Startup))]

namespace OAuth20
{
    public class Startup
    {
        public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

        public void Configuration(IAppBuilder app)
        {
            OAuthOptions = new OAuthAuthorizationServerOptions()
            {
                TokenEndpointPath = new PathString("/token"),
                Provider = new OAuthAuthorizationServerProvider()
                {
                    OnValidateClientAuthentication = async (context) =>
                    {
                        context.Validated();
                    },
                    OnGrantResourceOwnerCredentials = async (context) =>
                    {
                        if (context.UserName == "test.test@mail.com" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

Projenizi çalıştırın. Jeton, açılır pencerede görüntülenmelidir.


5
ASP Identity veya Entity Framework'ü kullanmamanızı gerçekten çok seviyorum. Gördüğüm çoğu makale, bunları OAuth çözümüyle entegre ediyor. Çözümünüz, OAuth'a ve jetonun verilmesine odaklanır. Çok hoş. Blogunuza gönderi paylaştığınız için de teşekkür ederiz.
webworm

@Kai - Nerede Microsoft ASP.NET Identity Owindevreye giriyor? Kullanıcı kimlik doğrulamanız için ASP.NET Identity kullanıyor musunuz? Değilse, bu NuGet paketi hala gerekli mi?
webworm

1
@webworm - Hat app.UseOAuthBearerTokens(OAuthOptions);olmadan çalışmaz Microsoft ASP.NET Identity Owin. Yöntemi tanımıyor UseOAuthBearerTokens.
Kai Hartmann

eksik paket: Microsoft.Owin.Host.SystemWeb, Microsoft ASP.NET Identity Owin
Muhammed Afsal

3
Sadece bir şey eklemek istiyorum, yani siz de Newtonsoft.Json geçersiz derleme hatası alıyorsanız (.NET 4.6 ve üstü) o zaman lütfen Newtonsoft.Json'ı sürüm 11 veya üstüne güncelleyin.
vibs2006


-12

Gmail: OAuth

  • Bağlantıya git
  • Gmail kullanıcı adı şifrenizle giriş yapın
  • Sol üstteki google menüsüne tıklayın
  • API Yöneticisi'ni tıklayın
  • Kimlik Bilgilerine tıklayın
  • Kimlik Bilgileri Oluştur'u tıklayın ve OAuth İstemcisi'ni seçin.
  • Uygulama türü olarak Web Uygulamasını seçin ve Adı Girin- > Yetkili Yönlendirme URL'sini Girin (Örn: http: // localhost: 53922 / signin-google ) -> Oluştur düğmesine tıklayın. Bu, kimlik bilgilerini oluşturacaktır. Pls not edin Client IDve Secret ID. Son olarak kimlik bilgileri açılır penceresini kapatmak için Tamam'ı tıklayın.
  • Bir sonraki önemli adım, Google API ,. Sol bölmedeki Genel Bakış'a tıklayın.
  • Tıklayın Google APISosyal API'leri bölümünde.
  • Etkinleştir'i tıklayın.

Hepsi Google kısmından.

Uygulamanıza geri dönün App_start/Startup.Auth.cs, aşağıdaki kod parçacığını açın ve açıklamasını kaldırın

        app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = "",
            ClientSecret = ""
        });

Güncelleme ClientIdve ClientSecretdeğerlerle Google APIdaha önceden oluşturmuş kimlik bilgileri.

  • Uygulamanızı çalıştırın
  • Oturum Aç'a tıklayın
  • Google düğmesini 'Giriş yapmak için Başka Bir Bölüm Kullan' bölümünde göreceksiniz
  • Google düğmesine tıklayın
  • Uygulama sizden kullanıcı adı ve şifreyi girmenizi isteyecek
  • Gmail kullanıcı adını ve şifresini girin ve Oturum Aç'ı tıklayın
  • Bu, OAuth işlemini gerçekleştirecek ve uygulamanıza geri dönecek ve Gmailkimlik ile kaydolmanızı isteyecektir .
  • Kaydolmak için kaydol'a tıklayın GmailKimliği uygulama veritabanınıza kaydol'a .
  • Kimlik ayrıntılarının en üstte normal kayıt olarak göründüğünü göreceksiniz
  • Çıkış yapmayı deneyin ve Gmail üzerinden tekrar giriş yapın. Bu, otomatik olarak uygulamaya giriş yapmanızı sağlar.

15
Kullanıcı açıkça Facebook veya Gmail girişlerini kullanmak istemediğini belirtiyor.
Bartho Bernsmann

Bu yanıta olumsuz oy vermenin gerekli olduğunu düşünmüyorum. En üstteki yoruma olumlu oy vermek yeterlidir. Bu cevap faydalı bilgiler içerir ve cevaplayıcı, söz konusu bilgiyi sağlamak için gerçek yaratıcı çaba sarf etmiştir. Why punish that effort? Belki de SO'nun, OP'lerin sorusuna yanlış hizalanmış bir yanıtı işaretlemek için bir yola ihtiyacı vardır. Veya kullanıcıların daha uygun bir soruya taşınmasını önermesine izin vermek ... veya cevaptan yeni bir soru oluşturmak için.
Walter Stabosz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.